linux awk 排序,shell三剑客之awk(包括sort排序和uniq工具)

a28b4ce89d27df9fe23a4b8c8e44bc1e.png

shell三剑客之awk

在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复杂的文本操作,被广泛应用于 Shell 脚本,完成各种自动化配置任务。

awk 所使用的命令格式如下所示,其中,单引号加上大括号“{}”用于设置对数据进行的处理动作。awk 可以直接处理目标文件,也可以通过“-f”读取脚本对目标文件进行处理。

awk工具命令格式

awk 选项 '模式或条件 {编辑指令}' 文件 1 文件 2 „ //过滤并输出文件符条件的内容

awk -f 脚本文件 文件 1 文件 2 „ //从脚本中调用编辑指令,过滤并输出内容

7

awk 比较倾向于将一行分成多个“字段”然后再进行处理,且默认情况下字段的分隔符为空格或者 tab 键。awk 执行结果可以通过 print 的功能将字段数据打印显示。在使用 awk 命令的过程中,可以使用逻辑操作符“&&”,表示“与”, “||”表示“或”,“!”表示“非”;还可以进行简单的数学运算,如+、-、*、/、%、^分别 表示加、减、乘、除、取余和乘方。

找出/etc/passwd 的用户名、用户 ID、组 ID 等列, 执行以下 awk 命令即可。

[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 中类似于位置变量的方法, 用$1、$2、$3„顺序地表示行(记录)中的不同字段。另外 awk 用$0 表示整个行(记录)。不同的字段之间是通过指定的字符分隔。awk 默认的分隔符是空格。awk 允许在命令行中用“-F 分隔符”的形式来指定分隔符。

awk 包含几个特殊的内建变量(可直接用)如下所示:

(1)FS:指定每行文本的字段分隔符,默认为空格或制表位。

(2)NF:当前处理的行的字段个数。

(3)NR:当前处理的行的行号(序数)。

(4)$0:当前处理的行的整行内容。

(6)FILENAME:被处理的文件名。

(7)RS9:数据记录分隔,默认为\n,即每行为一条记录。

一.awk用法

(1)输出所有内容,等同于 cat chen.txt,

[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.

(2)输出第 1~3 行内容

[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

(3)输出所有奇数行的内容

[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

(4)输出所有偶数行的内容

[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

(5)输出所有偶数行的内容

awk '/^The/{print}' chen.txt

THE

THEASDHAS

(6)输出以limit.结尾的行

[root@localhost ~]# awk '/limit.$/{print}' chen.txt

Use graphical install limit.

(7)统计以/bin/bash 结尾的行数,等同于greo -c “/bin/bash” chen.txt

[root@localhost ~]# awk 'BEGIN {x=0} ; /\/bin\/bash$/{x++};END{print x}' /etc/passwd

(8)统计以the分隔的文本段落数

[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

(1)输出每行中的第1,3个字段

[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

(2)输出密码为“*”的用户的shadow 记录

[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:::

(3)输出以冒号分隔且第 7 个字段中包含/bash 的行的第 1 个字段

[root@localhost ~]# awk '($1~"nfs")&&(NF=7){print $1,$2}' /etc/passwd

nfsnobody:x:65534:65534:Anonymous NFS

(4)输出第 7 个字段既不为/bin/bash 也不为/sbin/nologin 的所有行

[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

(二)通过管道,双引号调用shell命令

调用wc -l 命令统计使用bash 的用户个数,等同于 grep -c “bash$” /etc/passwd

[root@localhost ~]# awk -F : '/bash$/{print | "wc -l"}' /etc/passwd

2

(1)调用w 命令,并用来统计在线用户数

[root@localhost ~]# awk 'BEGIN {while ("w" | getline) n++ ;{print n-2}}'

2

(2)调用hostname,并输出当前的主机名

[root@localhost ~]# awk 'BEGIN {"hostname" | getline ; print $0}'

localhost.localdomain

三.sort 工具

sort 是一个以行为单位对文件内容进行排序的工具,也可以根据不同的数据类型来排序。例如数据和字符的牌局就不一样。sort 命令的语法为“sort [选项] 参数”,其中常用的选项包括以下几种。

(1)-f:忽略大小写;

(2)-b:忽略每行前面的空格;

(3)-M:按照月份进行排序;

(4)-n:按照数字进行排序;

(5)-r:反向排序;

(6)-u:等同于 uniq,表示相同的数据仅显示一行;

(7)-t:指定分隔符,默认使用[Tab]键分隔;

(8)-o :将排序后的结果转存至指定文件;

(9)-k:指定排序区域。

1:将/etc/passwd 文件中的账号进行排序。

排序规则是开头按字母排序,如果开头都是一样的就按照第二个字母从小到大

[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

(1)将/etc/passwd 文件中第三列进行反向排序

[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

(2)将/etc/passwd 文件中第三列进行排序,并将输出内容保存至user.txt 文件中

[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工具

Uniq 工具在 Linux 系统中通常与 sort 命令结合使用,用于报告或者忽略文件中的重复行。具体的命令语法格式为:uniq [选项] 参数。其中常用选项包括以下几种。

(1)-c:进行计数;

(2)-d:仅显示重复行;

(3)-u:仅显示出现一次的行;

1:删除 a 文件中的重复行。

[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

uniq工具删除重复但是只删除连续重复的

(2)删除 a 文件中的重复行,并在行首显示该行重复出现的次数

[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

(3)查找 testfile 文件中的重复行。

[root@localhost ~]# uniq -d a.txt

centos7 6.2

centos7 6.2

谢谢收看

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值