1、概述
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本。
2、命令格式
gawk [POSIX or GNU style options ] -f program-file [ -- ] file ...
gawk [POSIX or GNU style options ] [ -- ] program-text file ...
pgawk [POSIX or GNU style options ] -f program-file [ -- ] file ...
pgawk [POSIX or GNU style options ] [ -- ] program-text file ...
3、常用命令选项
由于 man awk 的信息太多,而且awk比较复杂,所以请参考下面的示例进行学习。
4、常用示例
1、查看一个文件3-8行的信息
模拟数据
[oldboy@oldboy awktest]$ echo {01..10}
01 02 03 04 05 06 07 08 09 10
[oldboy@oldboy awktest]$ echo {01..10} | xargs -n 1
01
02
03
04
05
06
07
08
09
10
[oldboy@oldboy awktest]$ echo {01..10} | xargs -n 1 >> 01test
[oldboy@oldboy awktest]$ ll
total 4
-rw-rw-r-- 1 oldboy oldboy 30 Apr 19 09:43 01test
[oldboy@oldboy awktest]$ cat 01test
01
02
03
04
05
06
07
08
09
10
解答:
方法1
[oldboy@oldboy awktest]$ awk 'NR>=3 && NR <=8{print $0}' 01test
03
04
05
06
07
08
[oldboy@oldboy awktest]$ awk 'NR>=3 && NR<=8{print NR,$0}' 01test #该处NR用于显示行号
3 03
4 04
5 05
6 06
7 07
8 08
方法2
[oldboy@oldboy awktest]$ awk '{if(NR>=3 && NR<=8){print $0}}' 01test
03
04
05
06
07
08
总结:
1、NR代表行号,可以直接使用用于确定第几行【可以用于打印行号】
2、$0代表整行 $1 代表第一列 $2 代表第二列 $NF 代表最后一列
3、{print NR,$0} 其中的 , 在页面显示为空格
2、使用awk过滤出当前一级目录,不需要目录下的目录
当前数据
[oldboy@oldboy ~]$ ls -l
total 40
drwxrwxr-x 3 oldboy oldboy 4096 Apr 16 20:56 3week
-rw-rw-r-- 2 oldboy oldboy 29 Apr 18 21:49 BBB.txt
-rw-rw-r-- 1 oldboy oldboy 0 Apr 15 18:57 aaa.tem
drwxrwxr-x 2 oldboy oldboy 4096 Apr 19 01:24 aaac
drwxrwxr-x 2 oldboy oldboy 4096 Apr 19 09:43 awktest
drwxrwxr-x 2 oldboy oldboy 4096 Apr 13 23:08 bbb
drwxrwxr-x 3 oldboy oldboy 4096 Apr 13 23:08 ccc
-rw-rw-r-- 2 oldboy oldboy 29 Apr 18 21:49 ccc.txt
-rw-rw-r-- 1 oldboy oldboy 0 Apr 15 18:54 lkkk
drwxr-xr-x 7 oldboy oldboy 4096 Oct 28 2011 oldboy
-rw-rw-r-- 1 oldboy oldboy 1 Apr 13 21:00 test0
-rw-rw-r-- 1 oldboy root 0 Apr 13 13:04 test1
-rw-rw-r-- 1 oldboy oldboy 0 Apr 13 13:17 test2
lrwxrwxrwx 1 oldboy oldboy 5 Apr 13 13:30 test4 -> test0
-rw-rw-r-- 1 oldboy oldboy 0 Apr 14 21:39 time.txt
drwxrwxr-x 3 oldboy oldboy 4096 Apr 15 11:06 tools
思路:
1、根据secureCRT中颜色区分
2、ls 命令中 -F 和–p 会对目录追加 / 信息
3、ls 命令中 –l 如果开头为d的那么为目录
4、find 中根据-type d 查找
5、tree中根据 d 查找
解决:
[oldboy@oldboy ~]$ ls -l | awk '/^d/{print $NF}' # //正则匹配 /^d/ 以d开头 $NF 最后一列
3week
aaac
awktest
bbb
ccc
oldboy
tools
[oldboy@oldboy ~]$ ls -l | awk '/^d/{print $0}' # 方法1
drwxrwxr-x 3 oldboy oldboy 4096 Apr 16 20:56 3week
drwxrwxr-x 2 oldboy oldboy 4096 Apr 19 01:24 aaac
drwxrwxr-x 2 oldboy oldboy 4096 Apr 19 09:43 awktest
drwxrwxr-x 2 oldboy oldboy 4096 Apr 13 23:08 bbb
drwxrwxr-x 3 oldboy oldboy 4096 Apr 13 23:08 ccc
drwxr-xr-x 7 oldboy oldboy 4096 Oct 28 2011 oldboy
drwxrwxr-x 3 oldboy oldboy 4096 Apr 15 11:06 tools
[oldboy@oldboy ~]$ ls -F | awk '/\/$/{print $0}' # 或者 ls -lp | awk '/\/$/{print $NF}' # /\/$/ 以/结尾 其中 \/ 进行转义
3week/
aaac/
awktest/
bbb/
ccc/
oldboy/
tools/
[oldboy@oldboy ~]$ ls -lF | awk '/\/$/{print $0}' # ls -lp | awk '/\/$/{print $0}'
drwxrwxr-x 3 oldboy oldboy 4096 Apr 16 20:56 3week/
drwxrwxr-x 2 oldboy oldboy 4096 Apr 19 01:24 aaac/
drwxrwxr-x 2 oldboy oldboy 4096 Apr 19 09:43 awktest/
drwxrwxr-x 2 oldboy oldboy 4096 Apr 13 23:08 bbb/
drwxrwxr-x 3 oldboy oldboy 4096 Apr 13 23:08 ccc/
drwxr-xr-x 7 oldboy oldboy 4096 Oct 28 2011 oldboy/
drwxrwxr-x 3 oldboy oldboy 4096 Apr 15 11:06 tools/
[oldboy@oldboy ~]$ ls -p | awk '/\/$/' # ls -F | awk '/\/$/'
3week/
aaac/
awktest/
bbb/
ccc/
oldboy/
tools/
总结:
1、awk正则 /str/ ;/^d/ 以d开头; /\/$/ 以 / 结尾【\/进行转义】
2、$NF 代表最后一列 $0代表整行
3、Linux 安装后进行开机自启动项优化
0、模拟数据命令信息
生产环境默认的运营级别都为3【命令行模式】
#chkconfig --list | awk '{print $1}'
#chkconfig --list | awk '{print "chkconfig",$1,"on"}' # 使用空格分隔 如: chkconfig ntpd on
#chkconfig --list | awk '{print "chkconfig",$1,"on"}' | bash # 将所有信息将给bash执行
#chkconfig –list ##或者: chkconfig --list | grep '3:on' # 所有的服务都已经开启
1、思路1:关闭所有服务,打开我们需要的服务
命令行命令如下: *:请依次操作
#chkconfig --list
#chkconfig --list | awk '{print $1}'
#chkconfig --list | awk '{print "chkconfig",$1,"off"}'
#chkconfig --list | awk '{print "chkconfig",$1,"off"}' | bash
#chkconfig --list | grep '3:on' # 没有任何信息
#chkconfig --list | grep -E 'crond|rsyslog|network|sshd|sysstat'
#chkconfig --list | grep -E 'crond|rsyslog|network|sshd|sysstat' | awk '{print "chkconfig",$1,"on"}'
#chkconfig --list | grep -E 'crond|rsyslog|network|sshd|sysstat' | awk '{print "chkconfig",$1,"on"}' | bash
#chkconfig --list | grep '3:on'
2、思路2:除了我们需要的服务,其他的服务都关闭 【推荐使用】
#chkconfig --list
#chkconfig --list | grep -Ev 'crond|network|rsyslog|sshd|sysstat'
#chkconfig --list | grep -Ev 'crond|network|rsyslog|sshd|sysstat' | awk '{print "chkconfig",$1,"off"}'
#chkconfig --list | grep -Ev 'crond|network|rsyslog|sshd|sysstat' | awk '{print "chkconfig",$1,"off"}' | bash
#chkconfig --list | grep '3:on'
4、获取一个文件权限的八进制信息。如下: 那么该文件的权限为664
[oldboy@oldboy awktest]$ ll
total 4
-rw-rw-r-- 1 oldboy oldboy 30 Apr 19 09:43 01test
思路:
1、直接根据ls –l 得到权限信息,然后再转为八进制
2、根据命令stat 可以得到
解决:
方法1
[oldboy@oldboy awktest]$ ls -l
total 4
-rw-rw-r-- 1 oldboy oldboy 30 Apr 19 09:43 01test
[oldboy@oldboy awktest]$ ls -l | cut -c 2-10
otal 4
rw-rw-r--
[oldboy@oldboy awktest]$ ls -l | cut -c 2-10 | tr 'rwx-' '4210'
otal 4
420420400
[oldboy@oldboy awktest]$ ls -l | cut -c 2-10 | tr 'rwx-' '4210' | awk -F "" 'NR==2{print $1+$2+$3,$4+$5+$6,$7+$8+$9}'
6 6 4
[oldboy@oldboy awktest]$ ls -l | cut -c 2-10 | tr 'rwx-' '4210' | awk -F "" 'NR==2{print $1+$2+$3""$4+$5+$6""$7+$8+$9}'
664
方法2
[oldboy@oldboy awktest]$ stat 01test
File: `01test'
Size: 30 Blocks: 8 IO Block: 4096 regular file
Device: 803h/2051d Inode: 272071 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 500/ oldboy) Gid: ( 500/ oldboy)
Access: 2016-04-19 09:43:36.337334080 +0800
Modify: 2016-04-19 09:43:29.932325160 +0800
Change: 2016-04-19 09:43:29.932325160 +0800
[oldboy@oldboy awktest]$ stat 01test | awk -F "[0/]" 'NR==4{print $2}'
664
[oldboy@oldboy awktest]$ stat -c %a 01test # stat自带该功能
664
5、对/etc/passwd 的第一列和最后一列换位
默认: root:x:0:0:root:/root:/bin/bash
修改后: /bin/bash:x:0:0:root:/root:root
解决:
[oldboy@oldboy ~]$ awk 'NR==1' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[oldboy@oldboy ~]$ awk -F ":" 'NR==1{print $7":"$2":"$3":"$4":"$5":"$6":"$1}' /etc/passwd
/bin/bash:x:0:0:root:/root:root
[oldboy@oldboy ~]$ awk -F ":" '{print $7":"$2":"$3":"$4":"$5":"$6":"$1}' /etc/passwd
/bin/bash:x:0:0:root:/root:root
/sbin/nologin:x:1:1:bin:/bin:bin
/sbin/nologin:x:2:2:daemon:/sbin:daemon
/sbin/nologin:x:3:4:adm:/var/adm:adm
/sbin/nologin:x:4:7:lp:/var/spool/lpd:lp
………………
6、根据ifconfig 获取eth0的IP。
数据:
[oldboy@oldboy ~]$ ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:0C:29:A3:EF:65
inet addr:192.168.91.130 Bcast:192.168.91.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fea3:ef65/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3507 errors:0 dropped:0 overruns:0 frame:0
TX packets:2504 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:321266 (313.7 KiB) TX bytes:386293 (377.2 KiB)
解决:
[oldboy@oldboy ~]$ ifconfig eth0 | awk -F "[ :]+" 'NR==2{print $4}'
192.168.91.130
总结:
1、-F "[ :]+" 其中 [ :] 代表空格和:进行分隔 外面的+ 表示同时可以存在多个分隔符。
5、命令所在位置和类型
[root@oldboy ~]# which awk
/bin/awk
[root@oldboy ~]# type awk
awk is /bin/awk
6、另请参见