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

awk工具

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

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

Demo1:

查出/etc/passwd的用户名等列,执行如下命令

[[email protected] ~]# awk -F ‘:‘ ‘{print $1,$3,$4}‘ /etc/passwd
root 0 0
bin 1 1
daemon 2 2
//以下省略多行

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

FS:指定每行文本的字段分隔符,默认为空格或制表位。
NF:当前处理的行的字段个数。
NR:当前处理的行的行号(序数)。
$0:当前处理的行的整行内容。
$n:当前处理行的第 n 个字段(第 n 列)。
FILENAME:被处理的文件名。
RS:数据记录分隔,默认为\n,即每行为一条记录。

按行输出文本:

[[email protected] ~]# awk ‘NR==1,NR==3{print}‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

[[email protected] ~]# awk -F ":" ‘NR==1,NR==3{print $1,$3}‘ /etc/passwd
root 0
bin 1
daemon 2

[[email protected] ~]# awk -F ":" ‘(NR>=1)&&(NR<=3){print $1,$3}‘ /etc/passwd
root 0
bin 1
daemon 2
输出所有奇偶行的内容:
奇数行:
[[email protected]host ~]# awk -F ":" ‘NR%2==1{print $1,$3}‘ /etc/passwd
root 0
daemon 2
lp 4
shutdown 6
mail 8
games 12
nobody 99
dbus 81
abrt 173
rpc 32
saslauth 996
pulse 171
rpcuser 29
ntp 38
usbmuxd 113
qemu 107
setroubleshoot 993
gdm 42
sshd 74
postfix 89
zhou 1000
named 25
偶数行:
[[email protected] ~]# awk -F ":" ‘NR%2==0{print $1,$3}‘ /etc/passwd
bin 1
adm 3
sync 5
halt 7
operator 11
ftp 14
systemd-network 192
polkitd 999
libstoragemgmt 998
colord 997
rtkit 172
chrony 995
nfsnobody 65534
tss 59
geoclue 994
radvd 75
sssd 992
gnome-initial-setup 991
avahi 70
tcpdump 72
dhcpd 177
输出以root开头的行:
[[email protected] ~]# awk ‘/^root/{print}‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash
统计以/bin/bash结尾的行数:
[[email protected] ~]# awk ‘BEGIN {x=0} ; /\/bin\/bash$/{x++};END {print x}‘ /etc/passwd
2
统计以空行分隔的文本段落数:
[[email protected] opt]# vim name.txt
zhangsan:lisi:wangwu
zhaoliu:liuliu
heiba:heihei
[[email protected] opt]# awk ‘BEGIN{RS=":"};END{print NR}‘ /opt/name.txt
5
//统计规则:遇到关键符号,折行
字段输出:
[[email protected] opt]# awk -F ":" ‘$3=="0"{print}‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash

[[email protected] opt]# awk -F ":" ‘$3=="0"{print $1,$7}‘ /etc/passwd
root /bin/bash

输出密码为空的用户的shadow记录:
[[email protected] opt]# awk ‘BEGIN{FS=":"};$3=="0"{print}‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash

输出以冒号分隔且第7个字段包含bash:
[[email protected] opt]# awk -F : ‘$7~"bash"{print}‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash
zhou:x:1000:1000:zhou:/home/zhou:/bin/bash

以冒号为分隔,输出第一个字段包含nfs且总字段数为7的第1,3,7字段
方法一:[[email protected] opt]# awk -F : ‘($1~"nfs")&&(NF==7){print $1,$3,$7}‘ /etc/passwd
nfsnobody 65534 /sbin/nologin
方法二:[[email protected] opt]# awk ‘BEGIN{FS=":"};($1~"nfs")&&(NF==7){print $1,$3,$7}‘ /etc/passwd
nfsnobody 65534 /sbin/nologin

以冒号为分隔,第七个字段不包含/sbin/nologin且总字段为7的,1,3,7字段
[[email protected] opt]# awk ‘BEGIN{FS=":"};($7!="/sbin/nologin")&&(NF==7){print $1,$3,$7}‘ /etc/passwd
root 0 /bin/bash
sync 5 /bin/sync
shutdown 6 /sbin/shutdown
halt 7 /sbin/halt
zhou 1000 /bin/bash
named 25 /bin/false
调用wc -l 命令统计使用bash 的用户个数:
[[email protected] opt]# awk -F : ‘/bash$/{print | "wc -l"}‘ /etc/passwd
2
调用w 命令,并用来统计在线用户数:
[[email protected] opt]# awk ‘BEGIN {while ("w" | getline) n++;{print n-2}}‘
1
调用hostname,并输出当前的主机名:
[[email protected] opt]# awk ‘BEGIN {"hostname" | getline ; print $0}‘
localhost.localdomain

sort工具

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

-f:忽略大小写

-b:忽略每行前面的空格

-M:按照月份进行排序

-n:按照数字进行排序

-r:反向排序

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

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

-o <输出文件>:将排序后的结果转存至指定文件

-k:指定排序区域

uniq工具

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

-c:进行计数

-d:仅显示重复行

-u:仅显示出现一次的行

原文地址:https://blog.51cto.com/14464303/2440556

时间: 2024-08-28 15:40:51

Shell脚本三剑客(awk、sort、uniq)内含多个小Demo的相关文章

Linux Shell常用技巧(六) sort uniq tar split

Linux Shell常用技巧(六) sort uniq tar split 十二.   行的排序命令sort:   1.  sort命令行选项: 选项 描述 -t 字段之间的分隔符 -f 基于字符排序时忽略大小写 -k 定义排序的域字段,或者是基于域字段的部分数据进行排序 -m 将已排序的输入文件,合并为一个排序后的输出数据流 -n 以整数类型比较字段 -o outfile 将输出写到指定的文件 -r 倒置排序的顺序为由大到小,正常排序为由小到大 -u 只有唯一的记录,丢弃所有具有相同键值的记

awk sort uniq

命令: grep -ri '23/Mar/2017'  access.log  | awk -F"|" '{print $2}' | sort -r |uniq -c | sort -k1,1nr 统计log中各ip访问的次数 grep -ri '23/Mar/2017'  access.log  | awk -F"|" '{print $2}' | sort |uniq |wc -l 统计log中独立ip量 sort:  对单词进行排序 uniq -c:  显示唯

[linux] grep awk sort uniq学习

grep的-A-B-选项详解grep能找出带有关键字的行,但是工作中有时需要找出该行前后的行,下面是解释1. grep -A1 keyword filename找出filename中带有keyword的行,输出中除显示该行外,还显示之后的一行(After 1)2. grep -B1 keyword filename找出filename中带有keyword的行,输出中除显示该行外,还显示之前的一行(Before 1)3. grep -1 keyword filename找出filename中带有k

使用awk+sort+uniq进行文本分析

1.uniq命令uniq - report or omit repeated lines介绍:uniq对指定的ASCII文件或标准输入进行唯一性检查,以判断文本文件中重复出现的行.常用于系统排查及日志分析命令格式:uniq [OPTION]... [File1 [File2]]uniq从已经排序好的文本文件File1中删除重复的行,输出到标准标准输出或File2.常作为过滤器,配合管道使用.在使用uniq命令之前,必须确保操作的文本文件已经过sort排序,若不带参数运行uniq,将删除重复的行.

shell脚本之awk工具的使用

在Linux系统中,awk是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或过滤处理,可以在无交互的情况下实现相当复杂的文本操作,被我们运维人员广泛应用于shell脚本,完成各中自动化配置任务. awk可以直接处理目标文件,也可以和sed命令一样通过"-f"选项读取脚本对目标文件进行处理. awk的语法格式如下: sed命令常用于整行处理,而awk比较倾向于将一行分成多个字段,awk可以使用逻辑操作符"&&

(转)Shell脚本编程--Uniq命令

uniq 原文:http://blog.csdn.net/xifeijian/article/details/9209627 uniq命令可以去除排序过的文件中的重复行,因此uniq经常和sort合用.也就是说,为了使uniq起作用,所有的重复行必须是相邻的. uniq语法 [[email protected] ~]# uniq [-icu] 选项与参数: -i :忽略大小写字符的不同: -c :进行计数 -u :只显示唯一的行 testfile的内容如下 cat testfile hello

shell 文本处理的几个命名sed,awk,sort,uniq,cut

文本处理 Cat命令 1)  拼接文件:纵向拼接,不是横向拼接 [email protected]:~# cat list list2 line2 line3 line4 line5 line5 line6 line7 total 32K lrwxrwxrwx 1 root root   12 Jan  4 11:30 backup -> /data/backup -rw-r--r-- 1 root root   46 Apr  1 13:18 list -rw-r--r-- 1 root ro

Shell脚本三剑客——Grep(进阶版egrep)、Sed、Awk命令

Grep命令 1.基本正则表达式实例--查找特定字符 这里我们就以存放本机所有用户的/etc/passwd文件做实例 Demo1 [[email protected] ~]# grep -n "root" /etc/passwd //-n表示显示行号 1:root:x:0:0:root:/root:/bin/bash 10:operator:x:11:0:operator:/root:/sbin/nologin 2.基本正则表达式实例--查找集合字符 有重复的字符时,可使用"

shell脚本之awk基本用法

脚本文件: [email protected]:/study/shell# cat awk_test.sh #!/bin/sh awk_test_fun() { echo "\$0:" echo $0 echo "\$1:" echo $1 echo "\$2:" echo $2 echo "\$3:" echo $3 echo "awk_test.txt content:" cat awk_test.tx