【笔记目录】
例1:读取指定列的内容
例2:-F指定分割的符号
例3:在输出的开头和结尾添加输出
例4:搜索含有某关键字的行
例5:单双引号
例6:条件判断
例7:复合表达式
例8:BEGIN END
例9:if else
【awk简介】
awk是一个强大的文本分析工具,awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作
【初级篇】
例1:读取指定列的内容
1 [root@localhost ~]# last -5 2 root pts/0 192.168.18.238 Tue Jul 16 17:07 still logged in 3 oracle pts/0 192.168.18.238 Tue Jul 16 15:19 - 17:07 (01:48) 4 root pts/1 192.168.18.238 Fri Jul 12 11:42 - 17:07 (4+05:24) 5 oracle pts/1 192.168.18.238 Fri Jul 12 11:42 - 11:42 (00:00) 6 oracle pts/0 192.168.18.238 Fri Jul 12 11:42 - 11:42 (00:00) 7 8 wtmp begins Tue Jul 11 04:10:39 2017
1 [root@localhost ~]# last -5 | awk '{print $1}' 2 root 3 oracle 4 root 5 oracle 6 oracle 7 8 wtmp
1 # awk工作流程:逐行读取(以'\n'区分),默认以空格分开,0是整行内容,1是第一列内容 2 # 这种是awk+action的示例。每行都会执行action{print $1} -F指定 域分隔符为 ':'(默认的域分隔符是空格) 3 [root@localhost ~]# cat /etc/passwd | awk -F':' '{print $1}' 4 root 5 bin 6 daemon 7 adm 8 lp 9 sync 10 shutdown 11 halt 12 mail 13 operator 14 games 15 ftp 16 nobody 17 systemd-bus-proxy 18 systemd-network 19 dbus 20 polkitd 21 tss 22 sshd 23 postfix 24 oracle
例2:-F指定分割的符号
1 [root@localhost ~]# cat /etc/passwd | awk -F':' '{print $1"\t"$7}' 2 root /bin/bash 3 bin /sbin/nologin 4 daemon /sbin/nologin 5 adm /sbin/nologin 6 lp /sbin/nologin 7 sync /bin/sync 8 shutdown /sbin/shutdown 9 halt /sbin/halt 10 mail /sbin/nologin 11 operator /sbin/nologin 12 games /sbin/nologin 13 ftp /sbin/nologin 14 nobody /sbin/nologin 15 systemd-bus-proxy /sbin/nologin 16 systemd-network /sbin/nologin 17 dbus /sbin/nologin 18 polkitd /sbin/nologin 19 tss /sbin/nologin 20 sshd /sbin/nologin 21 postfix /sbin/nologin 22 oracle /bin/bash
例3:在输出的开头和结尾添加输出
awk的工作原理是这样的:先执行BEGIN,然后读取文件,读入有\n换行分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,随后开始执行模式所对应的动作action,接着开始读入第二条记录,直到所有的记录都读完,最后执行END操作
1 [root@localhost ~]# cat /etc/passwd | awk -F':' 'BEGIN{print "name,shell"} {print $1","$7} END{print "blue,/bin/nosh"}' 2 name,shell 3 root,/bin/bash 4 bin,/sbin/nologin 5 daemon,/sbin/nologin 6 adm,/sbin/nologin 7 lp,/sbin/nologin 8 sync,/bin/sync 9 shutdown,/sbin/shutdown 10 halt,/sbin/halt 11 mail,/sbin/nologin 12 operator,/sbin/nologin 13 games,/sbin/nologin 14 ftp,/sbin/nologin 15 nobody,/sbin/nologin 16 systemd-bus-proxy,/sbin/nologin 17 systemd-network,/sbin/nologin 18 dbus,/sbin/nologin 19 polkitd,/sbin/nologin 20 tss,/sbin/nologin 21 sshd,/sbin/nologin 22 postfix,/sbin/nologin 23 oracle,/bin/bash 24 blue,/bin/nosh
例4:搜索含有某关键字的行
1 [root@localhost ~]# cat /etc/passwd | awk -F':' '/oracle/{print $0}' 2 oracle:x:1000:1000::/home/oracle:/bin/bash
例5:单双引号
1 # 双引号 2 awk '{print "\""}' 3 4 # 单引号 5 awk '{print "'\''"}' 6 7 # 现在在读出的每行内容加上单引号,行末加上逗号 8 9 [root@localhost ~]# cat /etc/passwd | awk -F':' '{print "'\''"$1"'\''"","}' 10 'root', 11 'bin', 12 'daemon', 13 'adm', 14 'lp', 15 'sync', 16 'shutdown', 17 'halt', 18 'mail', 19 'operator', 20 'games', 21 'ftp', 22 'nobody', 23 'systemd-bus-proxy', 24 'systemd-network', 25 'dbus', 26 'polkitd', 27 'tss', 28 'sshd', 29 'postfix', 30 'oracle',
例6:内置变量
1 ARGC 命令行参数个数 2 ARGV 命令行参数排列 3 ENVIRON 支持队列中系统环境变量的使用 4 FILENAME awk浏览的文件名 5 FNR 浏览文件的记录数 6 FS 设置输入域分隔符,等价于 -F选项 7 NF 浏览记录的域的个数 8 NR 已读的记录数 9 OFS 输出域分隔符 10 ORS 输出记录分隔符 11 RS 控制记录分隔符
1 [root@localhost ~]# awk -F':' '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF}' /etc/passwd 2 filename:/etc/passwd,linenumber:1,columns:7 3 filename:/etc/passwd,linenumber:2,columns:7 4 filename:/etc/passwd,linenumber:3,columns:7 5 filename:/etc/passwd,linenumber:4,columns:7 6 filename:/etc/passwd,linenumber:5,columns:7 7 filename:/etc/passwd,linenumber:6,columns:7 8 filename:/etc/passwd,linenumber:7,columns:7 9 filename:/etc/passwd,linenumber:8,columns:7 10 filename:/etc/passwd,linenumber:9,columns:7 11 filename:/etc/passwd,linenumber:10,columns:7 12 filename:/etc/passwd,linenumber:11,columns:7 13 filename:/etc/passwd,linenumber:12,columns:7 14 filename:/etc/passwd,linenumber:13,columns:7 15 filename:/etc/passwd,linenumber:14,columns:7 16 filename:/etc/passwd,linenumber:15,columns:7 17 filename:/etc/passwd,linenumber:16,columns:7 18 filename:/etc/passwd,linenumber:17,columns:7 19 filename:/etc/passwd,linenumber:18,columns:7 20 filename:/etc/passwd,linenumber:19,columns:7 21 filename:/etc/passwd,linenumber:20,columns:7 22 filename:/etc/passwd,linenumber:21,columns:7
【中级篇】
例7:条件判断
# 把文件中第二列大于10的行的 第一列+"is expensive"输出 [root@localhost bin]# cat 1.txt | awk '$2>10{print $1 " is expensive"}' Kiwi is expensive Apple is expensive
例8:复合表达式
# 把文件中第二列大于10的输出"is expensive", 小于9的输出"is cheap" [root@localhost bin]# cat 1.txt | awk '$2>10{print $1 " is expensive"} $2<9{print $1 " is cheap"}' Banana is cheap Paech is cheap Kiwi is expensive Pineapple is cheap Apple is expensive
例9:BEGIN END