Linux 三剑客之 awk 命令

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、另请参见

1、awk学习 【转】



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值