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

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 命令即可。


[[email protected] ~]# 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,

[[email protected] ~]# awk ‘{print $0}‘ chen.txt
[[email protected] ~]# awk ‘{print}‘ chen.txt  //这条命令和上面一条是一样的效果
#version=DEVEL
#System authorization information
aulth --enableshadow --passalgo=sha512
#Use CDROM installation media
cdlrom.
thethethe.

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

[[email protected] ~]# awk ‘NR==1,NR==3{print}‘ chen.txt   //这条命令和下面命令是一样的效果
[[email protected] ~]# awk ‘(NR>=1)&&(NR<=3){print}‘ chen.txt

#version=DEVEL
#System authorization information
aulth --enableshadow --passalgo=sha512

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

[[email protected] ~]# 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)输出所有偶数行的内容

[[email protected] ~]# 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.结尾的行

[[email protected] ~]# awk ‘/limit.$/{print}‘ chen.txt
Use graphical install limit.

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

[[email protected] ~]# awk ‘BEGIN {x=0} ; /\/bin\/bash$/{x++};END{print x}‘ /etc/passwd

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

[[email protected] ~]# awk ‘BEGIN {RS="the"};END{print NR}‘ chen.txt

(二)按字段输出文本

[[email protected] ~]# awk -F : ‘{print $3}‘ /etc/passwd
0
1
2
3
4
5
6
7
8
9
10
11

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

[[email protected] ~]# 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 记录

[[email protected] ~]# 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 个字段

[[email protected] ~]# awk ‘($1~"nfs")&&(NF=7){print $1,$2}‘ /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS

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

[[email protected] ~]# 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

[[email protected] ~]# awk -F : ‘/bash$/{print | "wc -l"}‘ /etc/passwd
2

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

[[email protected] ~]# awk ‘BEGIN {while ("w" | getline) n++ ;{print n-2}}‘
2

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

[[email protected] ~]# 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 文件中的账号进行排序。

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

[[email protected] ~]# 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 文件中第三列进行反向排序

[[email protected] ~]# 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 文件中

[[email protected] ~]# sort -t : -k 3 /etc/passwd -o chench.txt
[[email protected] ~]# 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 文件中的重复行。

[[email protected] ~]# 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
[[email protected] ~]# 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 文件中的重复行,并在行首显示该行重复出现的次数

[[email protected] ~]# 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 文件中的重复行。

[[email protected] ~]# uniq -d a.txt
centos7 6.2
centos7 6.2

谢谢收看

原文地址:https://blog.51cto.com/14449524/2442177

时间: 2024-07-30 07:58:08

shell三剑客之awk(包括sort排序和uniq工具)的相关文章

Shell脚本三剑客(awk、sort、uniq)内含多个小Demo

awk工具 在Linux/UNIX系统中,awk是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以再无交互的情况下实现相当复杂的文本操作,被广泛应用于Shell脚本,完成各种自动化配置任务. 1.awk常见用法:通常情况下 awk 所使用的命令格式如下所示,其中,单引号加上大括号"{}"用于设置对数据进行的处理动作.awk 可以直接处理目标文件,也可以通过"-f"读取脚本对目标文件进行处理. D

shell学习文件操作之sort,cut,uniq

linux系统使用过程中,我们经常需要对文件进行一些操作分析,例如对文本进行分类排序,去重,截取一些规则化字段.cut,sort,uniq很方便使用. 1.sort:一般有三种模式,分别为排序文本,检查文件,合并文件. 常用方法及参数 sort [option] [file] -b,#忽略前空格或者制表符 -d, #根据字典顺序排序,仅比较数字,字母和空字符 -f, #忽略大小写 -i, #仅仅比较可打印文件 -n, #根据算术值比较,空格,十进制数字等. -R, #根据哈希值随机排序 -r,

shell三剑客之一AWK的使用

AWK简介: AWK是一个强大的文本分析工具, 相对于其它两个grep和sed的编辑,AWK对数据的分析和处理,凸显其特性,AWK的命名来 源于它的创始者,(Alfred Aho .Peter Weinberger 和 Brain) 以下是AWK的三个版本 原始的AWK 新的NAWK POSIX/GNU版本的GAWK 基本语法: awk '{pattern action}' {filenames} 尽管操作可能会复杂,但是语法是这样的简单,其中pattern表示AWK在数据中查找的内容,而act

sort排序命令 uniq 去除排序过的文件中的重复行 cut提取命令 wc 统计命令

sort 命令对 File 参数指定的文件中的行排序,并将结果写到标准输出.如果 File 参数指定多个文件,那么 sort 命令将这些文件连接起来,并当作一个文件进行排序. sort语法 [[email protected] ~]# sort [-fbMnrtuk] [file or stdin] 选项与参数: -f :忽略大小写的差异,例如 A 与 a 视为编码相同: -b :忽略最前面的空格符部分: -M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法: -n :使用『纯数字

linux基础学习-18-linux三剑客之awk命令精讲

快捷跳转目录: * 第1章:awk基础入门       * 1.1:awk简介 * 1.2:学完awk你可以掌握: * 1.3:awk环境简介 * 1.4:awk的格式 * 1.5:模式动作 * 1.6:awk的执行过程 * 1.6.1:小结awk执行过程 * 1.7:记录和字段 * 1.7.1:记录(行) * 1.7.2:记录分隔符-RS * 1.7.3:对$0的认识 * 1.7.4:企业面试题 * 1.7.5:awk记录知识小结 * 1.7.6:字段(列) * 1.7.7:ORS与OFS简介

shell练习-sort排序详解

服务器上有个日志文件guest.log,每行包含:身份证号码,姓名,网吧名称,最近上网时间,上网时长,消费金额,现要求将文件的每行的第六列和第二列取出来按照消费金额倒序输出到另外一个文件test.log,请给出shell命令? awk "{print $6 $2}" guest.log|sort  -rn -o test.log                                                      Sort 1.原理: sort将文件的每一行作为一个

Shell命令学习 之,sort,unique 文件简单排序去除重复记录

经常会碰到文件里有重复记录的场景,要么去除重复记录,要么统计下重复记录数,这些简单的功能可以通过shell命令里的sort,uniq组合实现, 比如文件a.txt记录如下 test,test1,test2 test test1 test2 test,test1,test2 abcd edfg abcd ddddd 去除重复行: sort a.txt |uniq abcd ddddd edfg test test,test1,test2 test1 test2 查找非重复行 [[email pro

不看绝对后悔的Linux三剑客之awk实战精讲

一.Linux三剑客之awk命令精讲 第1章 awk基础入门 1.1 awk简介 awk不仅仅时linux系统中的一个命令,而且是一种编程语言,可以用来处理数据和生成报告(excel).处理的数据可以是一个或多个文件,可以是来自标准输入,也可以通过管道获取标准输入,awk可以在命令行上直接编辑命令进行操作,也可以编写成awk程序来进行更为复杂的运用.本章主要讲解awk命令的运用 1.2 awk环境简介 [[email protected] ~]# cat /etc/redhat-release 

文本处理三剑客之awk(报告生成器)

文本处理三剑客之awk(报告生成器) awk是一款强大的报告生成器,不同于sed和grep,它的侧重点是如何把文本信息更好的展示出来,常用与统计和格式化输出.awk相当于微型的shell,有着自己一套语法结构,例如:循环结构,数组,条件判断,函数,内置变量等功能. awk在我认为简直就是文本处理时打劫放火一大利器. 例如取出/etc/passwd中的第一列. [root@CentOS6 ~]# awk -F: '{print $1}' /etc/passwd root bin daemon ad