awk
文本和数据进行处理的编程语言
补充说明
awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。
awk命令格式和选项
语法形式
awk [options] 'script' var=value file(s)
awk [options] -f scriptfile var=value file(s)
常用命令选项
- -F fs fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:,默认的分隔符是连续的空格或制表符
- -v var=value 赋值一个用户定义变量,将外部变量传递给awk
- -f scripfile 从脚本文件中读取awk命令
- -m[fr] val 对val值设置内在限制,-mf选项限制分配给val的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。
awk模式和操作
awk脚本是由模式和操作组成的。
模式
模式可以是以下任意一个:
- /正则表达式/:使用通配符的扩展集。
- 关系表达式:使用运算符进行操作,可以是字符串或数字的比较测试。
- 模式匹配表达式:用运算符
~(匹配)和!~(不匹配)。 - BEGIN语句块、pattern语句块、END语句块:参见awk的工作原理
操作
操作由一个或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内,主要部分是:
- 变量或数组赋值
- 输出命令
- 内置函数
- 控制流语句
awk脚本基本结构
awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file
一个awk脚本通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块3部分组成,这三个部分是可选的。任意一个部分都可以不出现在脚本中,脚本通常是被 单引号 中,例如:
awk 'BEGIN{ i=0 } { i++ } END{ print i }' filename
awk的工作原理
awk 'BEGIN{ commands } pattern{ commands } END{ commands }'
- 第一步:执行
BEGIN{ commands }语句块中的语句; - 第二步:从文件或标准输入(stdin)读取一行,然后执行
pattern{ commands }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。 - 第三步:当读至输入流末尾时,执行
END{ commands }语句块。
BEGIN语句块 在awk开始从输入流中读取行 之前 被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。
axel
多线程下载工具
补充说明
axel 是Linux下一个不错的HTTP/ftp高速下载工具。支持多线程下载、断点续传,且可以从多个地址或者从一个地址的多个连接来下载同一个文件。适合网速不给力时多线程下载提高下载速度。比如在国内VPS或服务器上下载lnmp一键安装包用Axel就比wget快。
安装
CentOS安装Axel:
目前yum源上没有Axel,我们可以到 http://pkgs.repoforge.org/axel/ 下载rpm包安装。
32位CentOS执行下面命令:
wget -c http://pkgs.repoforge.org/axel/axel-2.4-1.el5.rf.i386.rpm
rpm -ivh axel-2.4-1.el5.rf.i386.rpm
64位CentOS执行下面命令:
wget -c http://pkgs.repoforge.org/axel/axel-2.4-1.el5.rf.x86_64.rpm
rpm -ivh axel-2.4-1.el5.rf.x86_64.rpm
Debian/Ubuntu安装Axel:
apt-get install axel
语法
axel [options] url1 [url2] [url...]
选项
--max-speed=x , -s x # 最高速度x
--num-connections=x , -n x # 连接数x
--output=f , -o f # 下载为本地文件f
--search[=x] , -S [x] # 搜索镜像
--header=x , -H x # 添加头文件字符串x(指定 HTTP header)
--user-agent=x , -U x # 设置用户代理(指定 HTTP user agent)
--no-proxy , -N # 不使用代理服务器
--quiet , -q # 静默模式
--verbose ,-v # 更多状态信息
--alternate , -a # Alternate progress indicator
--help ,-h # 帮助
--version ,-V # 版本信息
实例
如下载lnmp安装包指定10个线程,存到 /tmp/:
badblocks
查找磁盘中损坏的区块
补充说明
badblock命令 用于查找磁盘中损坏的区块。 硬盘是一个损耗设备,当使用一段时间后可能会出现坏道等物理故障。电脑硬盘出现坏道后,如果不及时更换或进行技术处理,坏道就会越来越多,并会造成频繁死机和数据丢失。最好的处理方式是更换磁盘,但在临时的情况下,应及时屏蔽坏道部分的扇区,不要触动它们。badblocks就是一个很好的检查坏道位置的工具。
语法
badblock(选项)(参数)
选项
-b<区块大小>:指定磁盘的区块大小,单位为字节;
-o<输出文件>:将检查的结果写入指定的输出文件;
-s:在检查时显示进度;
-v:执行时显示详细的信息;
-w:在检查时,执行写入测试。
参数
- 磁盘装置:指定要检查的磁盘装置;
- 磁盘区块数:指定磁盘装置的区块总数;
- 启始区块:指定要从哪个区块开始检查。
实例
badblocks以 4096 的一个block,每一个block检查16次,将结果输出到“hda-badblocks-list”文件里。
badblocks -b 4096 -c 16 /dev/hda1 -o hda-badblocks-list
hda-badblocks-list是个文本文件,内容如下:
cat hda-badblocks-list
51249
51250
51251
51253
51254
……
61245
……
可以针对可疑的区块多做几次操作。下面,badblocks以4096字节为一个“block”,每一个“block”检查1次, 将结果输出到“hda-badblocks-list.1”文件中,由第51000 block开始,到63000 block结束。
badblocks -b 4096 -c 1 /dev/hda1 -o hda-badblocks-list.1 63000 51000
这次花费的时间比较短,硬盘在指定的情况下在很短的时间就产生“嘎嘎嘎嘎”的响声。由于检查条件的不同,其输出的结果也不完全是相同的。重复几次同样的操作,因条件多少都有些不同,所以结果也有所不同。进行多次操作后,直到产生最后的hda-badblock-list.final文件。
其他
1、fsck使用badblocks的信息
badblocks只会在日志文件中标记出坏道的信息,但若希望在检测磁盘时也能跳过这些坏块不检测,可以使用fsck的-l参数:
fsck.ext3 -l /tmp/hda-badblock-list.final /dev/hda1
2、在创建文件系统前检测坏道
badblocks可以随e2fsck和mke2fs的-c删除一起运行(对ext3文件系统也一样),在创建文件系统前就先检测坏道信息:
mkfs.ext3 -c /dev/hda1
代码表示使用-c在创建文件系统前检查坏道的硬盘。
这个操作已经很清楚地告知我们可以采用mkfs.ext3 -c选项用read-only方式检查硬盘。这个命令会在格式化硬盘时检查硬盘,并标出错误的硬盘“block”。用这个方法格式化硬盘,需要有相当大的耐心,因为命令运行后,会一个个用读的方式检查硬盘。
base64
base64 编码/解码文件或标准输入输出
描述
base64将文件或标准输入编码或解码为标准输出;
语法
base64 [OPTION]... [FILE]
参数
-d, --decode # 解码
-i, --ignore-garbage # 解码时,忽略非字母字符
-w, --wrap=COLS # 在指定的字符数后自动换行(默认为76), 0 为禁用自动换行
--help # 显示此帮助说明并退出
--version # 输出版本信息并退出
实例
编码字符串
printf foo|base64
编码文件
base64 file
解码
printf Zm9v|base64 -d
解码文件
base64 -d file
basename
打印目录或者文件的基本名称
补充说明
basename命令 用于打印目录或者文件的基本名称。basename和dirname命令通常用于shell脚本中的命令替换来指定和指定的输入文件名称有所差异的输出文件名称。
语法
basename(选项)(参数)
选项
--help:显示帮助;
--version:显示版本号。
参数
- 文件:带路径信息的文件;
- 后缀:可选参数,指定要去除的文件后缀字符串。
实例
1、要显示一个shell变量的基本名称,请输入:
basename $WORKFILE
此命令显示指定给shell变量WORKFILE的值的基本名称。如果WORKFILE变量的值是/home/jim/program.c文件,则此命令显示program.c。
要构造一个和另一个文件名称相同(除了后缀)的文件名称,请输入:
OFILE=`basename $1 .c`.o
此命令指定给 OFILE 文件第一个位置上的参数($1)的值,但它的 .c 后缀更改至 .o。如果 $1 是 /home/jim/program.c 文件,则 OFILE 成为 program.o。因为 program.o 仅是一个基本文件名称,它标识在当前目录中的文件。
batch
在系统不繁忙的时候执行定时任务
补充说明
batch命令 用于在指定时间,当系统不繁忙时执行任务,用法与at相似。
语法
batch(选项)(参数)
选项
-f:指定包含具体指令的任务文件;
-q:指定新任务的队列名称;
-m:任务执行完后向用户发送E-mail。
参数
日期时间:指定任务执行的日期时间。
实例
batch
at> echo 1234
at> <EOT>
job 5 at Sun Apr 28 08:49:00 2013
bc
算术操作精密运算工具
补充说明
bc命令 是一种支持任意精度的交互执行的计算器语言。bash内置了对整数四则运算的支持,但是并不支持浮点运算,而bc命令可以很方便的进行浮点运算,当然整数运算也不再话下。
语法
bc(选项)(参数)
选项
-i:强制进入交互式模式;
-l:定义使用的标准数学库;
-w:对POSIX bc的扩展给出警告信息;
-q:不打印正常的GNU bc环境信息;
-v:显示指令版本信息;
-h:显示指令的帮助信息。
参数
文件:指定包含计算任务的文件。
实例
算术操作高级运算bc命令它可以执行浮点运算和一些高级函数:
echo "1.212*3" | bc
3.636
设定小数精度(数值范围)
echo "scale=2;3/8" | bc
0.37
参数scale=2是将bc输出结果的小数位设置为2位。
进制转换
#!/bin/bash
abc=192
echo "obase=2;$abc" | bc
执行结果为:11000000,这是用bc将十进制转换成二进制。
#!/bin/bash
abc=11000000
echo "obase=10;ibase=2;$abc" | bc
执行结果为:192,这是用bc将二进制转换为十进制。
计算平方和平方根:
echo "10^10" | bc
echo "sqrt(100)" | bc
bg
将前台终端作业移动到后台运行
概要
bg [job_spec ...]
主要用途
-
用于将作业放到后台运行,使前台可以执行其他任务。该命令的运行效果与在指令后面添加符号
&的效果是相同的,都是将其放到系统后台执行。 -
若后台任务中只有一个,则使用该命令时可以省略任务号。
参数
job_spec(可选):指定要移动到后台执行的作业标识符,可以是一到多个。
返回值
返回成功除非未开启作业控制或发生了错误。
例子
# 运行sleep命令,然后按下ctrl+z。
sleep 60
^Z
[1]+ Stopped sleep 60
# 使用bg命令使得作业在后台运行。
bg %1
# 返回信息:
[1]+ sleep 60 &
注意
bash的作业控制命令包括bg fg kill wait disown suspend。- 该命令需要
set选项monitor处于开启状态时才能执行;查看作业控制状态:输入set -o查看monitor行;执行set -o monitor或set -m开启该选项。 - 该命令是bash内建命令,相关的帮助信息请查看
help命令。
bind
显示或设置键盘按键与其相关的功能
补充说明
bind命令 用于显示和设置命令行的键盘序列绑定功能。通过这一命令,可以提高命令行中操作效率。您可以利用bind命令了解有哪些按键组合与其功能,也可以自行指定要用哪些按键组合。
语法
bind(选项)
选项
-d:显示按键配置的内容;
-f<按键配置文件>:载入指定的按键配置文件;
-l:列出所有的功能;
-m<按键配置>:指定按键配置;
-q<功能>:显示指定功能的按键;
-v:列出目前的按键配置与其功能。
实例
bind -x '"\C-l":ls -l' #直接按 CTRL+L 就列出目录
其中keyseq可以使用showkey -a命令来获取:
showkey -a
Press any keys - Ctrl-D will terminate this program
^[[A 27 0033 0x1b 上
91 0133 0x5b
65 0101 0x41
^[[B 27 0033 0x1b 下
91 0133 0x5b
66 0102 0x42
^[[D 27 0033 0x1b 左
91 0133 0x5b
68 0104 0x44
^[[C 27 0033 0x1b 右
91 0133 0x5b
67 0103 0x43
32 0040 0x20
^M 13 0015 0x0d 字母M
^C 3 0003 0x03 Ctrl-C
^D 4 0004 0x04 Ctrl-D 退出
blkid
查看块设备的文件系统类型、LABEL、UUID等信息
补充说明
在Linux下可以使用 blkid命令 对查询设备上所采用文件系统类型进行查询。blkid主要用来对系统的块设备(包括交换分区)所使用的文件系统类型、LABEL、UUID等信息进行查询。要使用这个命令必须安装e2fsprogs软件包。
语法
blkid -L | -U
blkid [-c ] [-ghlLv] [-o] [-s ][-t ] -[w ] [ ...]
blkid -p [-s ] [-O ] [-S ][-o] ...
blkid -i [-s ] [-o] ...
选项
-c <file> # 指定cache文件(default: /etc/blkid.tab, /dev/null = none)
-d # don't encode non-printing characters
-h # 显示帮助信息
-g # garbage collect the blkid cache
-o <format> # 指定输出格式
-k # list all known filesystems/RAIDs and exit
-s <tag> # 显示指定信息,默认显示所有信息
-t <token> # find device with a specific token (NAME=value pair)
-l # look up only first device with token specified by -t
-L <label> # convert LABEL to device name
-U <uuid> # convert UUID to device name
-v # 显示版本信息
-w <file> # write cache to different file (/dev/null = no write)
<dev> # specify device(s) to probe (default: all devices)
Low-level probing options:
-p # low-level superblocks probing (bypass cache)
-i # gather information about I/O limits
-S <size> # overwrite device size
-O <offset> # probe at the given offset
-u <list> # filter by "usage" (e.g. -u filesystem,raid)
-n <list> # filter by filesystem type (e.g. -n vfat,ext3)
实例
1、列出当前系统中所有已挂载文件系统的类型: