[Linux] awk命令详解
awk用于格式化报文或者从文件中抽取数据包.
1.$awk '{print $0}' gefforey.txt | tee gefforey.doc
该命令将在屏幕输出gefforey.txt文件内容并将其内容复制到gefforey.doc文件中.
2.$awk -F: '{print $1}' gefforey.log
该命令以:为单位读取gefforey.log文件中第一列内容.
3.$awk 'BEGIN {print "Name Belt\n------------"} {print $1"\t"$3}' gefforey.txt
该
命令将在屏幕首先输出"Name
Belt",第二行输出"------------",并在输出文件内容的时候,每列之间间隔一个TAB位.可以在print语句之后加上END
{print "end of output"},那么将会在文件内容输出结束的时候打印"end of output".
4.$awk '$2 ~ /^baidu$/ {print $0}' gefforey.txt
该命令显示gefforey.txt文件中以空格分隔的第二列字符串是"baidu"的所有行.
5.$awk '{if($2 ~ /^baidu$/) print $0}' gefforey.txt
该命令判断如果某行第二列字符串为"baidu",则打印出该行.
6.$awk '{if($2 < $3) print $0}' gefforey.txt
该命令显示判断如果某行第二列值小于第三列值,则打印该行.awk的条件操作符有:
< 小于,> = 大于等于,< = 小于等于,~ 匹配正则表达式,= = 等于,!~ 不匹配正则表达式,!= 不等于
7.$awk '{if($2 =="google1" && $3=="google2") print $0}' gefforey.txt
该命令判断如果某行第二列值为"google1"并且第三列值为"google2",则打印出该行.awk的逻辑表达式有:&& AND,|| O R,! 非.
8.$awk '{print NF,NR,$0} END{print FILENAME}' gefforey.txt
该命令会输出浏览记录的域个数和已读的记录数,并在输出结尾打印文件名.awk内置的变量有:
A R G C 命令行参数个数
A R G V 命令行参数排列
E N V I R O N 支持队列中系统环境变量的使用
FILENAME a w k浏览的文件名
F N R 浏览文件的记录数
F S 设置输入域分隔符,等价于命令行- F选项
N F 浏览记录的域个数
N R 已读的记录数
O F S 输出域分隔符
O R S 输出记录分隔符
R S 控制记录分隔符
(附:1.N F的一个强大功能是将变量$ P W D的返回值传入a w k并显示其目录。这里需要指定域分隔
符/.命令为:echo $PWD | awk -F/ '{print $NF}';
2.显示文件名,命令为:echo "/usr/local/etc/rc.sybase" | awk -F/ '{print $NF}'.
9.$awk '{name=$1; belt=$3;if(belt ~ /yellow/) print name "is belt" belt }' gefforey.txt
该命令将第一列的值赋给变量name,第三行的值赋给变量belt,并打印语句.awk允许在语句中进行赋值操作,赋值操作符有:=, +=, *=, / =, %=, ^ = .
10.$awk 'gsub(/111/,222) {print $0}' gefforey.txt
该命令将文件中所有包含111的数字替换为222,awk的内置函数有:
g s u b ( r, s ) 在整个$ 0中用s替代r
g s u b ( r, s , t ) 在整个t中用s替代r
i n d e x ( s , t ) 返回s中字符串t的第一位置
l e n g t h ( s ) 返回s长度
m a t c h ( s , r ) 测试s是否包含匹配r的字符串
s p l i t ( s , a , f s ) 在f s上将s分成序列a
s p r i n t ( f m t , e x p ) 返回经f m t格式化后的e x p
s u b ( r, s ) 用$ 0中最左边最长的子串代替s
s u b s t r ( s , p ) 返回字符串s中从p开始的后缀部分
s u b s t r ( s , p , n ) 返回字符串s中从p开始长度为n的后缀部分
g s u b函数有点类似于s e d查找和替换。它允许替换一个字符串或字符为另一个字符串或字
符,并以正则表达式的形式执行。第一个函数作用于记录$ 0,第二个g s u b函数允许指定目标,
然而,如果未指定目标,缺省为$ 0。
i n d e x(s,t)函数返回目标字符串s中查询字符串t的首位置。l e n g t h函数返回字符串s字符
长度。m a t c h函数测试字符串s是否包含一个正则表达式r定义的匹配。s p l i t使用域分隔符f s将
字符串s划分为指定序列a。s p r i n t函数类似于p r i n t f函数(以后涉及),返回基本输出格式f m t的
结果字符串e x p。s u b(r,s)函数将用s替代$ 0中最左边最长的子串,该子串被( r)匹配。
s u b(s,p)返回字符串s在位置p后的后缀。s u b s t r(s,p,n)同上,并指定子串长度为n。
11.$echo "65" | awk '{printf "//%c\n",$0}'
该命令管道输出65到awk,并观察其ASCII字符.awk的printf函数格式如下:
% c A S C I I字符
% d 整数
% e 浮点数,科学记数法
% f 浮点数,例如(1 2 3 . 4 4)
% g a w k决定使用哪种浮点数转换e或者f
% o 八进制数
% s 字符串
% x 十六进制数
awk命令也许是linux系统中最为复杂的命令,需要好好的练习!