借此机会学习一下awk的使用。
awk的命令形式是:
awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file
实际上就是对file文件中的每一行执行awk后面的那一串处理。因为awk是按行处理文件的。除此之外,我发现awk还是比较适合用来处理那种像下面的mytxt内容的文件,就是那种分成几行,几列的文件,每行都用分隔符分开,下面的mytxt使用的是使用空格当作分隔符。
- ‘{print $0}’ file
[zhang@zwfedora23 testbash]$ cat mytxt
zhangzha 35 male married 176cm 75kg
other 33 famle ok 165cm 60kg
computer 11 it single 100cm 50kg
[zhang@zwfedora23 testbash]$
其实,print后面的$0表示打印file文件的整个内容,还可以换成其他参数,如
[zhang@zwfedora23 testbash]$ awk '{print $1}' mytxt
zhangzha
other
computer
[zhang@zwfedora23 testbash]$ awk '{print $2}' mytxt
35
33
11
[zhang@zwfedora23 testbash]$ awk '{print $3}' mytxt
male
famle
it
[zhang@zwfedora23 testbash]$ awk '{print $4}' mytxt
married
ok
single
[zhang@zwfedora23 testbash]$ awk '{print $5}' mytxt
176cm
165cm
100cm
可见,print后面的那个参数$,表示的第几个段,这里默认的字符分隔符是空格。
我又修改了一下mytxt的内容,用来验证-F的使用
[zhang@zwfedora23 testbash]$ cat mytxt
zhangzha 35 male married 176cm 75kg
other 33 famle ok 165cm 60kg
computer 11 it single 100cm 50kg
are:you:ok:ma?
[zhang@zwfedora23 testbash]$
[zhang@zwfedora23 testbash]$ awk -F: '{print $1}' mytxt
zhangzha 35 male married 176cm 75kg
other 33 famle ok 165cm 60kg
computer 11 it single 100cm 50kg
are
[zhang@zwfedora23 testbash]$
可以看到,当使用-F来指定分隔符后,只有最后一行中带有冒号的被识别出来了,前面的几行由于没有冒号,所以就当作是一整个没有分隔符的字符串处理了。
还有一点,就是-F可以指定多个分隔符,这样就可以识别一个文件中的多个分隔符了:
[zhang@zwfedora23 testbash]$ awk -F'[: ]' '{print $1,$3,$6}' mytxt
zhangzha male 75kg
other famle 60kg
computer it 50kg
are ok
[zhang@zwfedora23 testbash]$
可见,不管是前3行的分隔符是空格,还是最后一行的冒号,都可以识别出来了。
OFS输出分隔符,是用来控制输出数据是使用什么来分割的
[zhang@zwfedora23 testbash]$ awk -F: '{print $1,$3,$6}' OFS="\t" mytxt
zhangzha 35 male married 176cm 75kg
other 33 famle ok 165cm 60kg
computer 11 it single 100cm 50kg
are ok
[zhang@zwfedora23 testbash]$ awk -F: '{print $1,$3,$6}' OFS="--" mytxt
zhangzha 35 male married 176cm 75kg----
other 33 famle ok 165cm 60kg----
computer 11 it single 100cm 50kg----
are--ok--
[zhang@zwfedora23 testbash]$
-f 是用来指定awk脚本的。具体的用法为:
awk -f script.awk file
其中,script.awk的内容为:
BEGIN{
FS=":"
}
{print $1}
[zhang@zwfedora23 testbash]$ awk -f script.awk mytxt
zhangzha 35 male married 176cm 75kg
other 33 famle ok 165cm 60kg
computer 11 it single 100cm 50kg
are
[zhang@zwfedora23 testbash]$
可见,它输出的结果是只识别出了最后一行中的冒号,符合预期。