丁祖平

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

【笔记目录】

例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

 

posted on 2019-07-16 19:04  丁祖平  阅读(227)  评论(0编辑  收藏  举报