awk工具

9.6 awk命令(上)

awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据能够来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更可能是做为脚原本使用。awk有不少内建的功能,好比数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优点。linux

awk应用

awk打印指定内容

awk ‘{print $n}’ [filename] 在此n表明数字(当n=0时$0表明文件全部内容,当n=1,2,3...时$1,2,3...表明相应列)ios

  • awk -F 指定分隔符(默认以空格为分隔符)
[root@1 awk]# awk -F ':' '{print $1}' test.txt
root
bin
daemon
daemon
Ctrl-Alt-Deoooleoooote ios handled by /usr/lib/systemd/system/c
……
能够一次打印多列:
[root@1 awk]# awk -F ':' '{print $1,$2,$3}' test.txt |head -3
root x 0
bin x 1
daemon x 2

能够指定打印各列内容时的分隔符号:
[root@1 awk]# awk -F ':' '{print $1"#"$2"#"$3}' test.txt |head -3
root#x#0
bin#x#1
daemon#x#2

说明: 指定分隔符后该命令只识别指定的分隔符,若是某行无指定的分隔符则会打印其整行!正则表达式

  • awk的匹配功能(匹配用“~”)
打印含有“oo”的全部行:
[root@1 awk]# awk '/oo/' test.txt
root:x:0:0:roprot:/root:/bin/bash
Ctrl-Alt-Deoooleoooote ios handled by /usr/lib/systemd/system/c
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 

打印第一段含有“oo”的行:
[root@1 awk]# awk -F ':' '$1 ~ /oo/' test.txt
注:‘~’表示匹配!

打印第一段中含有“oo”的行
root:x:0:0:roprot:/root:/bin/bash
Ctrl-Alt-Deoooleoooote ios handled by /usr/lib/systemd/system/c

支持正则表达式:
[root@1 awk]# awk -F ':' '$1 ~ /o+/' test.txt
root:x:0:0:roprot:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
Ctrl-Alt-Deoooleoooote ios handled by /usr/lib/systemd/system/c
[root@1 awk]# awk -F ':' '$1 ~ /oo+/' test.txt
root:x:0:0:roprot:/root:/bin/bash
Ctrl-Alt-Deoooleoooote ios handled by /usr/lib/systemd/system/c

支持多个表达式同时执行:
[root@1 awk]# awk -F ':' '/root/ {print $1,$3} /daemon/ {print $1,$3,$4}' test.txt
root 0
daemon 2 2
daemon 2 2
即:打印各行中带有root或daemon的第一、三、4段内容。也能够写成“ awk -F ':' '/root|daemon/ {print $1,$3,$4}' test.txt”

针对数学表达式的用法

  • 数值比较
当'$3>=1000 {print $1}'时:
[root@1 awk]# awk -F ':' '$3>=1000 {print $1}' test.txt
user001

当'$3>="1000" {print $1}'时:
[root@1 awk]# awk -F ':' '$3>="1000" {print $1}' test.txt |head -3
daemon
adm
lp

匹配字符串:
[root@1 awk]# awk -F ':' '$7!="/sbin/nologin" ' test.txt 
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
user001:x:1000:1000::/home/user001:/bin/bash
“!=”表示不等于

说明: 当“1000”加引号时会被当作是字符串,以ASC码(二进制)的方式进行计算处理,不加引号的时候会被当作是数值处理。编程

[root@1 awk]# head -n3 test.txt |awk -F ':' '{OFS=":"} $1="root"'
root:x:0:0:root:/root:/bin/bash
root:x:1:1:bin:/bin:/sbin/nologin
root:x:2:2:daemon:/sbin:/sbin/nologin

[root@1 awk]# awk -F ':' '$3=="0" {print $1}' test.txt
root

说明: 当使用一个“=”等号时表示为等号前面字符赋值,使用两个“==”表示逻辑关系(进行判断)。数组

9.7 awk 命令(下)

  • 字符比较大小
[root@1 awk]# awk -F ':' '$3<$4' test.txt
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
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

[root@1 awk]# awk -F ':' '$3==$4' test.txt |head -3
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

[root@1 awk]# awk -F ':' '$3>"5" && $3<"7"' test.txt 
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin

说明: “&&”表示而且。bash

[root@1 awk]# awk -F ':' '$3>1000 || $7!="/sbin/nologin"' test.txt 
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
user001:x:1000:1000::/home/user001:/bin/bash

[root@1 awk]# awk -F ':' '$3>1000 || $7~/bash/' test.txt 
root:x:0:0:root:/root:/bin/bash
user001:x:1000:1000::/home/user001:/bin/bash

说明: “||”表示或者。编程语言

OFS指定打印时的分隔符

语法1:
[root@1 awk]# awk -F ':' '{OFS="#"} $3>1000 || $7~/bash/ {print $1,$3,$7}' test.txt 
root#0#/bin/bash
user001#1000#/bin/bash

语法2:
[root@1 awk]# awk -F ':' '{OFS="#"} {if ($3>1000 || $7~/bash/) {print $1,$3,$7}}' test.txt 
root#0#/bin/bash
user001#1000#/bin/bash
  • NR (=number row)表示行号
[root@1 awk]# awk -F ':' '$3<5 && $7!="/sbin/nologin" {print NR":"$1}' test.txt
1:root
[root@1 awk]# awk -F ':' '$3<5 && $3>2 && $7=="/sbin/nologin" {print NR":"$1}' test.txt
4:adm
5:lp

打印前三行:
[root@1 awk]# awk -F ':' 'NR<=3' test.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@1 awk]# awk -F ':' 'NR<=3 && $1~/root/' test.txt
root:x:0:0:root:/root:/bin/bash

注: 相似于grep -n。函数

  • NF (=number fragment)表示段数(列)
[root@1 awk]# awk -F ':' '$3<5 && $3>2 && $7=="/sbin/nologin" {print NF":"$1}' test.txt
7:adm
7:lp
  • 求和
[root@1 awk]#  awk -F ':' '{(tot=tot+$3)}; END {print tot}' test.txt
5657
相关文章
相关标签/搜索