awk命令:
awk [option] 'pattern[action]' file
[option]为可选项参数
pattern为模式
[action]为执行动作,一般有print和printf
file则为文件
awk的内置变量:
$n 指定分隔符(如$1指的是第一个字段,$2指的是第二个字段,$NF则是最后一个字段)
$0 默认指的是全文
FS 字段分割符,默认为空格
NF 分割后,当前行有多少个字段
NR 当前记录行数
awk的内置函数学习:
[root@ths /]# sed -n '1,5p' lianxin | awk -F ':' '{print $1,$2,$NF}'
root x /bin/bash
bin x /sbin/nologin
daemon x /sbin/nologin
adm x /sbin/nologin
lp x /sbin/nologin
#首先打印出lianxin的前五行,使用awk罗列出第一,第二和最后一列(区别的分割符为:)
[root@ths /]# sed -n '1,5p' lianxin | awk -F ':' '{print $NF,$1}'
/bin/bash root
/sbin/nologin bin
/sbin/nologin daemon
/sbin/nologin adm
/sbin/nologin lp
#需要注意的是awk的文本处理是根据$的排序进行打印输出的
[root@ths /]# sed -n '1,5p' lianxin | awk -F ':' '{print "最后一列",$NF,"第一列",$1}'
最后一列 /bin/bash 第一列 root
最后一列 /sbin/nologin 第一列 bin
最后一列 /sbin/nologin 第一列 daemon
最后一列 /sbin/nologin 第一列 adm
最后一列 /sbin/nologin 第一列 lp
#也可以在$输出前加上相关的参数说明(需要注意的是,在内层增加参数需要使用"")
[root@ths /]# sed -n '1,5p' lianxin | awk -F ':' '{print "第一列",$1,"倒数第二列",$(NF-1)}'
第一列 root 倒数第二列 /root
第一列 bin 倒数第二列 /bin
第一列 daemon 倒数第二列 /sbin
第一列 adm 倒数第二列 /var/adm
第一列 lp 倒数第二列 /var/spool/lpd
#$NF表示最后一行,$(NF-1)则是表示倒数第二行
[root@ths /]# sed -n '1,5p' lianxin | awk -F ':' '{print "这一行有:"NF"个字符","第一列",$1,"倒数第二列",$(NF-1)}'
这一行有:7个字符 第一列 root 倒数第二列 /root
这一行有:7个字符 第一列 bin 倒数第二列 /bin
这一行有:7个字符 第一列 daemon 倒数第二列 /sbin
这一行有:7个字符 第一列 adm 倒数第二列 /var/adm
这一行有:7个字符 第一列 lp 倒数第二列 /var/spool/lpd
#通过""在awk中增加对应的文本注释,通过","来区分不同的符号文本
Awk的参数:
-F 指定分割字段
-v 定义/修改awk的一个内部变量
-f 从脚本中读取awk命令
[root@ths /]# sed -n '1,5p' lianxin | awk -F ':' '{print "这一行有:"NF"个字符","第一列",$1,"倒数第二列",$(NF-1),"通过:来进行划分"}'
这一行有:7个字符 第一列 root 倒数第二列 /root 通过:来进行划分
这一行有:7个字符 第一列 bin 倒数第二列 /bin 通过:来进行划分
这一行有:7个字符 第一列 daemon 倒数第二列 /sbin 通过:来进行划分
这一行有:7个字符 第一列 adm 倒数第二列 /var/adm 通过:来进行划分
这一行有:7个字符 第一列 lp 倒数第二列 /var/spool/lpd 通过:来进行划分
#NF表示有一行有多少个字符,$表示输出对应的列,-F则表示通过什么符进行区分
[root@ths /]# awk 'NR==5,NR==7' lianxin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
#打印lianxin的第5到7行
[root@ths /]# awk -F ':' '{print NR,"这一行有:"NF"个字符","第一列",$1,"倒数第二列",$(NF-1),"通过:分"}' lianxin | awk NR==5,NR==10
5 这一行有:7个字符 第一列 lp 倒数第二列 /var/spool/lpd 通过:分
6 这一行有:7个字符 第一列 sync 倒数第二列 /sbin 通过:分
7 这一行有:7个字符 第一列 shutdown 倒数第二列 /sbin 通过:分
8 这一行有:7个字符 第一列 halt 倒数第二列 /sbin 通过:分
9 这一行有:7个字符 第一列 mail 倒数第二列 /var/spool/mail 通过:分
10 这一行有:7个字符 第一列 operator 倒数第二列 /root 通过:分
#管道符前通过增加NR来对lianxi的文本提取出的行进行罗列,管道符后通过NR打印5-10行
awk的函数输入与输出符:
awk有输入和输入两种分割符,其中awk的输入分割符默认为空格,输出分割符则没有定义
输入分割符定义为FS,输出分割符为0FS
修改awk的默认输入分隔符方式有两种,一种为-F,另外一种则是-v FS=''
eg:
[root@ths /]# awk -F ':' 'NR==1,NR==5 {print $1,$2}' lianxin
root x
bin x
daemon x
adm x
lp x
[root@ths /]# awk -F ':' -v 'OFS=分隔符' 'NR==1,NR==5 {print $1,$2}' lianxin
root分隔符x
bin分隔符x
daemon分隔符x
adm分隔符x
lp分隔符x
#OFS使用中文也可以
[root@ths /]# awk -v 'FS=:' -v 'OFS=#' 'NR==1,NR==5 {print $1,$2}' lianxin
root#x
bin#x
daemon#x
adm#x
lp#x
#输入使用空格进行划分,输出使用#进行划分
[root@ths /]# awk -v 'FS=:' -v 'OFS=\t' 'NR==5,NR==10 {print NR,$1,$2}' lianxin
5 lp x
6 sync x
7 shutdown x
8 halt x
9 mail x
10 operator x
#OFS同样也可以匹配使用\t
AWk除了有内置的输入分割字符,同样还有换行字符RS
[root@ths /]# awk -v 'RS=:' -v 'ORS=//' 'NR==5,NR==10 {print FNR,$1,$2,FILENAME}' lianxin
5 root lianxin//6 /root lianxin//7 /bin/bash bin lianxin//8 x lianxin//9 1 lianxin//10 1 lianxin//
同样的awk还内置换行符ORS
[root@ths /]# awk -v 'FS=:' -v 'OFS=---' -v 'ORS=//' 'NR==5,NR==10 {print FNR,$1,$2,FILENAME}' lianxin
5---lp---x---lianxin//6---sync---x---lianxin//7---shutdown---x---lianxin//8---halt---x---lianxin//9---mail---x---lianxin//10---operator---x---lianxin//
awk的内置函数FILENAME同样也是用来标定文件的(文件的来源)
[root@ths /]# awk -v 'FS=:' -v 'OFS=---' ' {print FNR,$1,$2,FILENAME}' lianxin hehe | sed '15,25p' -n
15---dbus---x---lianxin
16---polkitd---x---lianxin
17---sshd---x---lianxin
18---postfix---x---lianxin
19---chrony---x---lianxin
20---lxb---x---lianxin
21---ntp---x---lianxin
1---root---x---hehe
2---bin---x---hehe
3---daemon---x---hehe
4---adm---x---hehe
awk的BEGIN和END:
[root@ths /]# awk -v FS=: 'BEGIN{print "nihao"}NR==5{print $1,$2,$NF}END{print "end"}' lianxin
nihao
lp x /sbin/nologin
end
#awk的执行顺序为:begin-print($)-end
[root@ths /]# awk -v FS=: 'END{print "nihao"}NR==5{print $1,$2,$NF}BEGIN{print "end"}' lianxin
end
lp x /sbin/nologin
nihao
[root@ths /]# awk -F ':' -v 'OFS= ' '$1=="lxb"{print NR,$1,$2}' lianxin
20 lxb x
#输出第一参数为lxb的那一行的第一和第二给参数
awk和正则表达式:
[root@ths /]# awk 'NR>=4 && NR<=8 {print NR,$0}' lianxin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
#打印输出第4到第八行的数据
[root@ths /]# awk '/\/sbin\/nologin$/{print $0}' lianxin
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
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
#使用awk+正则匹配出/sbin/nologin的行
[root@ths /]# awk '/^mail/,/^nobody/ {print $0}' lianxin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
#使用awk+正则匹配出以mail开头的行到以nobody开头的行