grep、sed和awk都是文本处理工具,虽然都是文本处理工具单却都有各自的优缺点,一种文本处理命令是不能被另一个完全替换的,否则也不会出现三个文本处理命令了。只不过,相比较而言,sed和awk功能更强大而已,且已独立成一种语言。
grep:文本过滤器,如果仅仅是过滤文本,可使用grep,其效率要比其他的高很多;
sed:Stream EDitor,流编辑器,默认只处理模式空间,不处理原数据,如果你处理的数据是针对行进行处理的,可以使用sed;
awk:报告生成器,格式化以后显示。如果对处理的数据需要生成报告之类的信息,或者你处理的数据是按列进行处理的,最好使用awk。
AWK是一种用于处理文本的编程语言工具。我们现在使用最多的是gawk,gawk是AWK的GNU版本。
使用格式:
# awk [options] '{print $1}' file1, file2, ...
awk的输出:print
print
print的使用格式:
print item1, item2, ...
要点
1、各项目之间使用逗号隔开,而输出时则以空格符分隔;
2、输出的item可以为字符串或数值、当前记录的字段(如$1)、变量或awk的表达式;数值会先转换为字符串,而后再输出;
3、print命令后面的item可以省略,此时其功能相当于print $0, 因此,如果想输出空白行,则需要使用print "";
awk脚本
awk脚本是由模式和操作组成的。
模式与操作
模式
模式可以是以下任意一种:
正则表达式:使用通配符的扩展集
关系表达式:使用运算符进行操作,可以是字符串或数字的比较测试
模式匹配表达式:用运算符~(匹配)和~!不匹配
BEGIN 语句块, pattern语句块, END语句块
操作
操作由一个或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大刮号内,主要部分是:变量或数组赋值、输出命令、内置函数、控制流语句。
AWK内置变量
$n : 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段。
$0 : 这个变量包含执行过程中当前行的文本内容。
ARGC : 命令行参数的数目。
ARGIND : 命令行中当前文件的位置(从0开始算)。
ARGV : 包含命令行参数的数组。
CONVFMT : 数字转换格式(默认值为%.6g)。
ENVIRON : 环境变量关联数组。
ERRNO : 最后一个系统错误的描述。
FIELDWIDTHS : 字段宽度列表(用空格键分隔)。
FILENAME : 当前输入文件的名。
NR : 表示记录数,在执行过程中对应于当前的行号
FNR : 同NR :,但相对于当前文件。
FS : 字段分隔符(默认是任何空格)。
IGNORECASE : 如果为真,则进行忽略大小写的匹配。
NF : 表示字段数,在执行过程中对应于当前的字段数。 print $NF答应一行中最后一个字段
OFMT : 数字的输出格式(默认值是%.6g)。
OFS : 输出字段分隔符(默认值是一个空格)。
ORS : 输出记录分隔符(默认值是一个换行符)。
RS : 记录分隔符(默认是一个换行符)。
RSTART : 由match函数所匹配的字符串的第一个位置。
RLENGTH : 由match函数所匹配的字符串的长度。
SUBSEP : 数组下标分隔符(默认值是34)。
BEGIN:让用户指定在第一条输入记录被处理之前所发生的动作,通常可在这里设置全局变量。
[root@node1 ~]# awk -F : '{print $1,$7}' passwd
awk 'BEGIN{OFS="#"} {print $1,$2}' ofs.txt
#指定输出的分隔符
awk 'BEGIN{OFS="#"} {print $1,"hello",$2}' ofs.txt
#指定输出的分隔符并会在其中添加hello字符
awk -F : -v OFS=# '{print $1,$7}' passwd
#以:为字段分隔符,以#号为输出分隔符,显示该文件的第一及第七字段的值
awk '{print $NF}' ofs.txt
#显示当前行的最后一个字段
[root@node1 ~]# ifconfig -a |grep ether | awk '{print $2}'
52:54:00:9f:76:c3
[root@node1 ~]# ifconfig -a | grep inet
inet 10.141.113.216 netmask 255.255.192.0 broadcast 10.141.127.255
inet 127.0.0.1 netmask 255.0.0.0
[root@node1 ~]# ifconfig -a |grep inet | awk '{print $2}'
10.141.113.216
127.0.0.1