awk常用用法
awk用法
awk 是以文件的一行为处理单元,一行一行的往下执行所定义的命令
awk -F “:” ‘{print $1}’
“print $1”是打印第一行的意思,所以一行一行的执行该命令,就把所有的第一行打印出来
常用参数:
-F ":"
#指定”:”为分隔符,从而每行分$1 $2…,第一个字段,第二个字段等,默认分隔符为空格-
{OSF="#"}
# 指定打印分隔符为”#”, -
/test/
#匹配字符段用”//“标注里面内容为匹配内容,这个匹配是一行所有内容匹配 -
$2 ~ /test/
#此匹配为字段2进行匹配 -
NR
#行的序列号 相当于”cat -n test.txt”打印序列号 NF
#相应行的字段$0 $1 $2...
#”1”第一字段,以此类推BEGIN
#一般每个语句每行都会执行,但是用了BEGIN指定后就只是在开始执行,用法比如定义变量可以放在此处END
#一般每个语句每行都会执行,但是用了END指定后就只是在结束时执行,用法用于总结比如计算总数并打印
定义约定
{}
#大括号一般是输出内容“print语句一定要用大括号括起来”,并且一个大括号相当于下面的分号括号里面的内容是一组内容;
#分号,分号为一组语法的结束,同一组语法是一起按顺序执行的,每组有每组语句的处理方式(结果)
‘{限定语句1 “空格” 执行操作1};{限定语句2 “空格” 执行操作2}’空格
#语句的分隔符
例子
- “;”和”{}” 分组语句
[test@xujb01 awk]$ awk -F ":" '{if(NR==1) print "$1: " $1} {if(NR==1) print "$2: " $2}' test.txt
$1: root
$2: x
#"{}"分组;执行完语句1,然后执行语句2以输出两行
[test@xujb01 awk]$ awk -F ":" '{if(NR==1) print "$1: " $1 ;if(NR==1 print "$2: " $2}' test.txt
$1: root
$2: x
#";"分组,"{}"把他们分成1组但是里面有";",所以组1里有 a,b两组语句
[test@xujb01 awk]$ awk -F ":" '{if(NR==1) print "$1: " $1, " $2: " $2}' test.txt
$1: root $2: x
#这是一组语句所以打印在一行里面 "print"内分隔服可以用","也可以省略
BEGIN END
[test@xujb01 awk]$ awk -F ":" 'BEGIN{tot=0;print "hello world"} {tot=$3+tot} END{print tot }' test.txt
hello world
11700
#第三个字段累加,并初始化tot=0,其实默认变量不定义直接使用都是0
[test@xujb01 awk]$ awk -F ":" 'BEGIN{print "hello world"} {tot=$3+tot} END{print tot }' test.txt
hello world
11700
#没有定义变量tot=0结果是一样的
[test@xujb01 awk]$ awk -F ":" 'BEGIN{print "hello world"} tot=$3+tot; END{print tot }' test.txt
hello world
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
...省略
#可以看到"tot=$3+tot"没有让大括号括起来,所以结尾要用分号和其他语句分开
#其实‘too=$3+tot’语句是和‘too=$3+tot{print $0}’ 是一样的
[test@xujb01 awk]$ awk -F ":" 'BEGIN{print "hello world"} tot=$3+tot{print $0}; END{print tot }' test.txt
hello world
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
...省略
#只有条件语句没有输出语句默认会输出'{print $0}'把该行所有的打印出来,(用括号括气来的为输出语句,没有叫条件语句)
[test@xujb01 awk]$ awk -F ":" 'NR==1' test.txt
root:x:0:0:root:/root:/bin/bash
#同理相当于 "awk -F ":" 'NR==1'{print $0} test.txt"
[test@xujb01 awk]$ awk -F ":" '{NR==1}' test.txt
[test@xujb01 awk]$
#而此例子,输出语句里没有打印所以就不打印内容
/test/和 $1 ~ /test/
t@xujb01 awk]$ awk -F ":" '/test/' test2.txt
test:test:1
aaa:test:1
t@xujb01 awk]$ awk -F ":" '$1 ~ /test/' test2.txt
test:test:1
[test@xujb01 awk]$
# '$1 ~ /test/' 只对第一字段进行匹配
和sed一样替换字符
[test@xujb01 awk]$ awk -F ":" '$1="root"' test2.txt
root test 1
root test 1
#第一字段替换成root
#还可以加上一些其他的限制
[test@xujb01 awk]$ awk -F ":" 'NR==1,$1="root"' test2.txt
root test 1
#第一行进行替换
[test@xujb01 awk]$ awk -F ":" 'NR==1,$1="root"{};{print $0}' test2.txt
root test 1
aaa:test:1
#语法1对语法2进行了影响,并且这个这是影响打印,并不会改变test2.txt的内容