在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,能够在无交互的状况下实现至关复杂的文本操做,被普遍应用于 Shell 脚本,完成各类自动化配置任务。linux
awk 所使用的命令格式以下所示,其中,单引号加上大括号“{}”用于设置对数据进行的处理动做。awk 能够直接处理目标文件,也能够经过“-f”读取脚本对目标文件进行处理。shell
awk 选项 '模式或条件 {编辑指令}' 文件 1 文件 2 „ //过滤并输出文件符条件的内容 awk -f 脚本文件 文件 1 文件 2 „ //从脚本中调用编辑指令,过滤并输出内容 7
awk 比较倾向于将一行分红多个“字段”而后再进行处理,且默认状况下字段的分隔符为空格或者 tab 键。awk 执行结果能够经过 print 的功能将字段数据打印显示。在使用 awk 命令的过程当中,可使用逻辑操做符“&&”,表示“与”, “||”表示“或”,“!”表示“非”;还能够进行简单的数学运算,如+、-、*、/、%、^分别 表示加、减、乘、除、取余和乘方。
找出/etc/passwd 的用户名、用户 ID、组 ID 等列, 执行如下 awk 命令便可。centos
[root@localhost ~]# awk -F : '{print $1,$3,$4}' /etc/passwd root 0 0 bin 1 1 daemon 2 2 adm 3 4 lp 4 7 sync 5 0 shutdown 6 0 halt 7 0 mail 8 12 operator 11 0 games 12 100 ftp 14 50 nobody 99 99 systemd-network 192 192 dbus 81 81 polkitd 999 998 abrt 173 173 libstoragemgmt 998 996 rpc 32 32 colord 997 995 saslauth 996 76 rtkit 172 172 pulse 171 171 chrony 995 991 rpcuser 29 29 nfsnobody 65534 65534 ntp 38 38 tss 59 59 usbmuxd 113 113 geoclue 994 989 qemu 107 107 radvd 75 75 setroubleshoot 993 988 sssd 992 987 gdm 42 42 gnome-initial-setup 991 986 sshd 74 74 avahi 70 70 postfix 89 89 tcpdump 72 72 chen 1000 1000
awk 从输入文件或者标准输入中读入信息,与 sed 同样,信息的读入也是逐行读取的。不一样的是 awk 将文本文件中的一行视为一个记录,而将一行中的某一部分(列)做为记录中的一个字段(域)。为了操做这些不一样的字段,awk 借用 shell 中相似于位置变量的方法, 用$一、$二、$3„顺序地表示行(记录)中的不一样字段。另外 awk 用$0 表示整个行(记录)。不一样的字段之间是经过指定的字符分隔。awk 默认的分隔符是空格。awk 容许在命令行中用“-F 分隔符”的形式来指定分隔符。bash
awk 包含几个特殊的内建变量(可直接用)以下所示:
(1)FS:指定每行文本的字段分隔符,默认为空格或制表位。
(2)NF:当前处理的行的字段个数。
(3)NR:当前处理的行的行号(序数)。
(4)$0:当前处理的行的整行内容。
(6)FILENAME:被处理的文件名。
(7)RS9:数据记录分隔,默认为\n,即每行为一条记录。dom
[root@localhost ~]# awk '{print $0}' chen.txt [root@localhost ~]# awk '{print}' chen.txt //这条命令和上面一条是同样的效果 #version=DEVEL #System authorization information aulth --enableshadow --passalgo=sha512 #Use CDROM installation media cdlrom. thethethe.
[root@localhost ~]# awk 'NR==1,NR==3{print}' chen.txt //这条命令和下面命令是同样的效果 [root@localhost ~]# awk '(NR>=1)&&(NR<=3){print}' chen.txt #version=DEVEL #System authorization information aulth --enableshadow --passalgo=sha512
[root@localhost ~]# awk '(NR%2)==1{print}' chen.txt Use CDROM installation media cdrom. thethethe. THE THEASDHAS Use graphical install. graphical. best test ASSDJFXYxyzC AxyzxyzxyzC keyboard --vckeymap=cn --xlayouts='cn' System language
[root@localhost ~]# awk '(NR%2)==0{print}' chen.txt Use graphical install. graphical. best test ASSDJFXYxyzC AxyzxyzxyzC keyboard --vckeymap=cn --xlayouts='cn' System language lang zh_CN.UTF-8 Network information network --bootproto=dhcp --device=ens33 --onboot=off --ipv6=auto --no-activate network --hostname=localhost.localdomain Root password rootpw --iscrypted $6$L.egxzosoP/0k9Nj$wna7vPXZjeH0jFcNZUymYKF8ySXq5HxQuvxTFxIpEAAxuDj7MQJtXBds5E0LxAftI1H5JbJuYpN44d5n6t1AZ. System services
awk '/^The/{print}' chen.txt THE THEASDHAS
[root@localhost ~]# awk '/limit.$/{print}' chen.txt Use graphical install limit.
[root@localhost ~]# awk 'BEGIN {x=0} ; /\/bin\/bash$/{x++};END{print x}' /etc/passwd
[root@localhost ~]# awk 'BEGIN {RS="the"};END{print NR}' chen.txt
[root@localhost ~]# awk -F : '{print $3}' /etc/passwd 0 1 2 3 4 5 6 7 8 9 10 11
[root@localhost ~]# awk -F : '{print $1,$3}' /etc/passwd root 0 bin 1 daemon 2 adm 3 lp 4 sync 5 shutdown 6 halt 7 mail 8 operator 11 games 12 ftp 14 nobody 99 systemd-network 192
[root@localhost ~]# awk -F : '$2== "*"{print}' /etc/shadow bin:*:17110:0:99999:7::: daemon:*:17110:0:99999:7::: adm:*:17110:0:99999:7::: lp:*:17110:0:99999:7::: sync:*:17110:0:99999:7::: shutdown:*:17110:0:99999:7::: halt:*:17110:0:99999:7::: mail:*:17110:0:99999:7::: operator:*:17110:0:99999:7::: games:*:17110:0:99999:7:::
[root@localhost ~]# awk '($1~"nfs")&&(NF=7){print $1,$2}' /etc/passwd nfsnobody:x:65534:65534:Anonymous NFS
[root@localhost ~]# awk -F : '($7!="/bin/bash")&&($7!="/sbin/nologin")' /etc/passwd sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt
[root@localhost ~]# awk -F : '/bash$/{print | "wc -l"}' /etc/passwd 2
[root@localhost ~]# awk 'BEGIN {while ("w" | getline) n++ ;{print n-2}}' 2
[root@localhost ~]# awk 'BEGIN {"hostname" | getline ; print $0}' localhost.localdomain
sort 是一个以行为单位对文件内容进行排序的工具,也能够根据不一样的数据类型来排序。例如数据和字符的牌局就不同。sort 命令的语法为“sort [选项] 参数”,其中经常使用的选项包括如下几种。
(1)-f:忽略大小写;
(2)-b:忽略每行前面的空格;
(3)-M:按照月份进行排序;
(4)-n:按照数字进行排序;
(5)-r:反向排序;
(6)-u:等同于 uniq,表示相同的数据仅显示一行;
(7)-t:指定分隔符,默认使用[Tab]键分隔;
(8)-o <输出文件>:将排序后的结果转存至指定文件;
(9)-k:指定排序区域。ssh
排序规则是开头按字母排序,若是开头都是同样的就按照第二个字母从小到大tcp
[root@localhost ~]# sort /etc/passwd abrt:x:173:173::/etc/abrt:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin bin:x:1:1:bin:/bin:/sbin/nologin chen:x:1000:1000:chen:/home/chen:/bin/bash chrony:x:995:991::/var/lib/chrony:/sbin/nologin colord:x:997:995:User for colord:/var/lib/colord:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin
[root@localhost ~]# sort -t : -rk 3 /etc/passwd nobody:x:99:99:Nobody:/:/sbin/nologin polkitd:x:999:998:User for polkitd:/:/sbin/nologin libstoragemgmt:x:998:996:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin colord:x:997:995:User for colord:/var/lib/colord:/sbin/nologin saslauth:x:996:76:Saslauthd user:/run/saslauthd:/sbin/nologin chrony:x:995:991::/var/lib/chrony:/sbin/nologin geoclue:x:994:989:User for geoclue:/var/lib/geoclue:/sbin/nologin setroubleshoot:x:993:988::/var/lib/setroubleshoot:/sbin/nologin sssd:x:992:987:User for sssd:/:/sbin/nologin gnome-initial-setup:x:991:986::/run/gnome-initial-setup/:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin
[root@localhost ~]# sort -t : -k 3 /etc/passwd -o chench.txt [root@localhost ~]# cat chench.txt root:x:0:0:root:/root:/bin/bash chen:x:1000:1000:chen:/home/chen:/bin/bash qemu:x:107:107:qemu user:/:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin bin:x:1:1:bin:/bin:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbi
Uniq 工具在 Linux 系统中一般与 sort 命令结合使用,用于报告或者忽略文件中的重复行。具体的命令语法格式为:uniq [选项] 参数。其中经常使用选项包括如下几种。
(1)-c:进行计数;
(2)-d:仅显示重复行;
(3)-u:仅显示出现一次的行;ide
[root@localhost ~]# cat a.txt centos7 6.2 centos7 6.2 centos7 6.2 centos7 6.2 centos7 6.2 centos7 6.6 centos7 6.2 centos7 6.2 centos7 6.3 centos7 6.5 linux 1 linux 2 linux 3 linux 4 linux 5 linux 6
[root@localhost ~]# uniq a.txt centos7 6.2 centos7 6.6 centos7 6.2 centos7 6.3 centos7 6.5 linux 1 linux 2 linux 3 linux 4 linux 5 linux 6
[root@localhost ~]# uniq -c a.txt 1 5 centos7 6.2 1 centos7 6.6 2 centos7 6.2 1 centos7 6.3 1 centos7 6.5 1 linux 1 1 linux 2 1 linux 3 1 linux 4 1 linux 5 1 linux 6 1
[root@localhost ~]# uniq -d a.txt centos7 6.2 centos7 6.2