awk命令及用法

awk 工具

awk是行处理器: 相比较屏幕处理的优势,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,一般用来格式化文本信息,awk命令在执行时不会直接更改文件的内容。正则表达式

  • awk '{print $1,$3}' filename打印文件中每行的第一第三段(默认段的分隔符为空格)
  • awk -F ':' '{print $1,$3}' filename 打印文件中每行的第一第三段(-F选项是指定分隔符为:)
[root@localhost tmp]# awk '{print $0}' 2.txt 
sss ssd dd gg  dd  asdf  gasdf
123 fqe fasd f fasd f ad  df aaf
 dfa sdf fasd fad fa df a 
 a df:fadf:afsdf:fad@afa@afad@afasd
fadf#asff#fasdf#afdas`
  • 这一段没有指定分隔符,而且$0的意思是打印全部段=cat命令
[root@localhost tmp]# awk '{print $1}' 2.txt 
sss
123
dfa
a
fadf#asff#fasdf#afdas`
  • awk '{print $1}' 2.txt 这条命令是打印文件中每行的第一段(默认分段符是空格)
  • awk -F ':' '{print $1}' 2.txt 这条命令式指定:为分段符,且打印每行的第一段
[root@localhost tmp]# awk -F ':' '{print $1}' 2.txt 
sss ssd dd gg  dd  asdf  gasdf
123 fqe fasd f fasd f ad  df aaf
 dfa sdf fasd fad fa df a 
 a df
  • 指定显示在屏幕上的分段符 awk '{print $1"#"$2"#"$3"#"$4}' filename
[root@localhost tmp]# awk '{print $1"#"$2"#"$3"#"$4}' 2.txt 
sss#ssd#dd#gg
123#fqe#fasd#f
dfa#sdf#fasd#fad
a#df:fadf:afsdf:fad@afa@afad@afasd##

显示出来的内容每段之间以#隔开bash

  • awk也能够列出指定关键字的行 awk '/oo/' filename 列出含有oo的行
[root@localhost awk]# awk '/oo/' 1.txt 
root:x:0:0:root:/root:/bin/bash
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
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
  • ~匹配符号,awk -F ':' '$1~/oo/' 1.txt 列出1.txt中第一段能匹配到oo的行
[root@localhost awk]# awk -F ':' '$1~/oo/' 1.txt
root:x:0:0:root:/root:/bin/bash
  • awk命令一样支持正则表达式awk -F ':' '$1~/oo+/' 1.txt
[root@localhost awk]# awk -F ':' '/oo+/' 1.txt
root:x:0:0:root:/root:/bin/bash
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
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
  • awk命令还支持多条正则表达式一块儿写awk -F':' '/root/{print $1,$2} /user/{print $3,$4}' 1.txt
[root@localhost awk]# awk -F ':' '/root/{print $1,$3} /user/{print $3,$4}' 1.txt
root 0
operator 11
  • awk -F ':' '$3==0{print $0}' 1.txt 列出第三段等于0的行
  • awk -F ':' '$3>=1000{print $0}' 1.txt 列出第三段大于等于1000的行
  • awk -F ':' '$7!="/sbin/nologin"{print $0}' 1.txt列出第七段不是/sbin/nologin的行
[root@localhost awk]#  awk -F ':' '$3==0{print $0}' 1.txt
root:x:0:0:root:/root:/bin/bash
[root@localhost awk]# awk -F ':' '$3>=1000{print $0}' 1.txt
lic:x:1000:1000::/home/lic:/bin/bash
[root@localhost awk]# awk -F ':' '$7!="/sbin/nologin"{print $0}' 1.txt
aabbccdd
AABBCCDD
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
lic:x:1000:1000::/home/lic:/bin/bash
  • awk -OFS 指定分隔符 awk -F ':' '{OFS="#"} $3>1000 || $7~/bash/' 1.txt
  • NR行号,NF段号
[root@localhost awk]# awk -F':' '{print NR"@"$0}' 1.txt
1@aabbccdd        显示行号
2@AABBCCDD
3@root:x:0:0:root:/root:/bin/bash
4@bin:x:1:1:bin:/bin:/sbin/nologin
5@daemon:x:2:2:daemon:/sbin:/sbin/nologin
6@adm:x:3:4:adm:/var/adm:/sbin/nologin
7@lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
8@sync:x:5:0:sync:/sbin:/bin/sync
9@shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
[root@localhost awk]# awk -F':' '{print NF"@"$0}' 1.txt
1@aabbccdd    显示每行多少段
1@AABBCCDD
7@root:x:0:0:root:/root:/bin/bash
7@bin:x:1:1:bin:/bin:/sbin/nologin
7@daemon:x:2:2:daemon:/sbin:/sbin/nologin
7@adm:x:3:4:adm:/var/adm:/sbin/nologin
7@lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
7@sync:x:5:0:sync:/sbin:/bin/sync
7@shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
  • 赋值 = awk -F ':' 'NR<=10{$1="boot"}' 1.txt
[root@localhost awk]#  awk -F ':' 'NR<=10{$1="boot"}{print $0}' 1.txt >> 2.txt
[root@localhost awk]# cat 2.txt 
boot
boot
boot x 0 0 root /root /bin/bash
boot x 1 1 bin /bin /sbin/nologin
boot x 2 2 daemon /sbin /sbin/nologin
boot x 3 4 adm /var/adm /sbin/nologin
boot x 4 7 lp /var/spool/lpd /sbin/nologin
boot x 5 0 sync /sbin /bin/sync
boot x 6 0 shutdown /sbin /sbin/shutdown
boot x 7 0 halt /sbin /sbin/halt
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

NR<=10表示行号小于等于10 ,也就是前十行,{$1="boot"}就是给第一段赋值为boot,后面依次是打印全部段,追加到2.txt中工具

  • 求和 awk -F':' '{(tot=tot+$3)};END{print tot}' 1.txt求全部行的第三段加起来的和值
[root@localhost awk]# awk -F':' '{(tot=tot+$3)};END{print tot}' 1.txt
2655
相关文章
相关标签/搜索