在广大Linux用户的工具箱中,有三个神奇的利器,它们能够以令人惊叹的方式处理文本数据、日志文件、配置文件等等。这三个工具分别是grep
、sed
和awk
。虽然它们各自有不同的功能和应用领域,但它们有一个共同点:它们都是Linux系统中不可或缺的重要工具,无论是初学者还是经验丰富的系统管理员,都离不开这三大利器。在本文中,我们将深入探讨这些工具的日常使用,揭示它们如何成为Linux用户的得力助手,简化各种文本处理任务。
grep

特定字符:grep ‘1’ passwd
范围内字符 :grep ‘[0-5]’ passwd grep ‘[259]’ passwd grep ‘[a-z]’ passwd
grep ‘[A-Z]’ passwd grep ‘[a-zA-Z]’ passwd grep ‘[,:/]’ passwd
grep ‘[^0-9]’ passwd 中括号里面代表是取反
任意字符:grep ‘.’ passwd
grep ‘[.]’ passwd 只表示.
grep ‘.’ passwd 通过转义只表示.
边界字符:头字符 grep ‘^root’ passwd 尾字符grep ‘false$’ passwd
空行的表示grep ‘^$’ passwd

字符串举例:‘root’ ‘1000’ ‘r..t’ ‘[A-Z][a-z]’ ‘[0-9][0-9]’

如对于test字符串重复
grep ‘\(test\)*’
grep ‘\(test\)\+’
grep ‘\(test\)\?’
重复特定的次数
*等价于 {0,}
+等价于{1,}
?等价于{0,1}
grep ‘[0-9]\{2,3\}’ passwd
行开头为r的任意字符串grep ‘^r.*’ passwd
逻辑或的用法
netstat -anp |grep ‘CONNECTED\|LISTENING’
netstat -anp |sed -n ‘/CONNECTED\|LISTENING/p’
netstat -anp |awk ‘/CONNECTED|LISTENING/ {print $0}’
匹配4到10位的QQ号
grep ‘^[0-9]/{4,10/}$’
匹配15位或18位的身份证(支持带X的)
grep ‘^[1-9]\([0-9]\{13\}\|[0-9]\{16\}\)[0-9xX]$’
匹配密码
grep ‘^\w\+$’

sed
-e -n
打印所有的行 sed -n ‘p’ passwd
选择对应条件行
sed -n ’10p’ passwd
nl passwd | sed -n ’10p’
sed -n ‘/zabbix/p ‘ passwd
nl passwd |sed -n ‘10,20p’
nl passwd |sed -n ‘/sshd/,/zabbix/p’
nl passwd |sed -n ’10!p’
nl passwd |sed -n ‘10,20!p’
nl passwd |sed -n ‘1~2p’
行处理命令
-a(新增行)在后边
-i(插入行)在前边
-c(替代行)
-d(删除行)
nl passwd |sed ‘5a——————‘
nl passwd |sed ‘1,5a—————‘
nl passwd |sed ‘5i—————‘
nl passwd |sed ‘1,5i—————‘
nl passwd |sed ‘5ctest’
nl passwd |sed ‘5,10ctest’ 五到十行会整体性的替换
nl passwd |sed ‘/zabbix/d’
优化服务器配置,ssh配置文件加入对应的文本
sed ‘$a port 2222 \npermitrootlogin no ‘ sshd_config
sed ‘$a \ port 2222 \n permitrootlogin no ‘ sshd_config 去除顶格
删除文本空行
sed ‘/^$/d’ passwd
选定日志中的Error行
sed -n ‘/Error/p’ fresh.log
替换功能 -s(替换) 分隔符 /,# 全局替换-g
把文件中所有的false替换成true
sed ‘s/false/true/’ passwd
全局内把:替换成%
sed ‘s/:/%/g’ passwd
案列
获取网卡中的IP
eth0: flags=4163 mtu 1500
inet 192.168.123.200 netmask 255.255.255.0 broadcast 192.168.123.255
inet6 fe80::54bd:b79d:5694:d805 prefixlen 64 scopeid 0x20
ether 00:15:5d:7b:8c:03 txqueuelen 1000 (Ethernet)
RX packets 4521 bytes 702680 (686.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1703 bytes 287010 (280.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ifconfig |sed -n ‘/inet /p’|sed ‘s/inet //’|sed ‘s/net.*//’
{}多个sed命令。用;进行分开
nl passwd |sed ‘{5,20d;s/false/true/}’
-n:读取下一个输入行(用下一个命令进行处理)
案列,间隔行输出
nl passwd |sed -n ‘{n;p}’ 偶数行
nl passwd |sed -n ‘{p;n}’ 奇数行
nl passwd |sed -n ‘1~2p’奇数行
nl passwd |sed -n ‘2~2p’偶数行
&替换固定的字符串
把用户名后边加上一个空格
sed ‘s/^[a-z_-]\+/& /’ passwd
将用户名首字母转换成大写
转换成大写/小写
\u \l 首字母
\U \L 字符串
sed ‘s/[a-z_-]\+/\u&/’ passw
将文件夹内的.txt文件,文件名转换成大写
ls *.txt |sed ‘s/^\w\+/\U&/’
\( \) 替换某部分的字符串(\1,\2)
获取网卡的IP
ifconfig |sed -n ‘/inet /p’|sed ‘s/inet \([0-9.]\+\) .*$/\1/’
获取passwd中的user,uid,gid
sed ‘s/^\([a-z_-]\+\):.*:\([0-9]\+\):\([0-9]\+\):.*$/user:\1 uid: \2 gid: \3/’ passwd
-r:复制指定文件插入到匹配行,不改变源文件
-w:复制匹配行拷贝到指定文件 ,改变源文件
sed ‘2r 123.txt’ abc.txt 读取123的文件内容插入到abc的第二段后
sed ‘2w abc.txt’ 123.txt把123的第二行写入到abc中,abc中原本的内容消失
sed ‘w abc.txt’ 123.txt 把123的整个内容都写入进去
-q:退出sed
nl passwd |sed ‘/false/q’找到第一个false就退出sed

awk
awk一次处理一行内容
awk可以对每行进行切片处理
awk ‘{ print $1}’ 输出首个单词
内置变量
$0:表示整个当前行
$1:每行第一个字段
$2:每行第二个字段 以此类推
指定分割符 默认空格
awk -F ‘:’ ‘{print $3}’ passwd
逗号分隔
awk -F ‘:’ ‘{print $1,$3}’ passwd
print 打印空格
awk -F ‘:’ ‘{print $1″ “$3}’ passwd
print打印制表符
awk -F ‘:’ ‘{print $1″\t”$3}’ passwd
awk -F ‘:’ ‘{print”username:”$1″ uid:”$3}’ passwd
获取行号和字段数量和处理的文件名
NR:行号
NF:字段数量变量
FILENAME:正在处理的文件名
awk -F ‘:’ ‘{print NR NF FILENAME}’ passwd
- 案例:显示passwd 每行的行号,每列的列数,对应行的用户名(print,printf)
awk -F ‘:’ ‘{print “line “NR,”Col ” NF,” User” $1}’ passwd
awk -F ‘:’ ‘{printf(“line:%3s col:%s user:%s\n”,NR,NF,$1) }’ passwd
- 显示passwd中用户ID大于100的行号和用户名(if…else…)
awk -F ‘:’ ‘{if($3>20) printf(“line:%3s col:%s user:%s\n”,NR,NF,$1) }’ passwd
- 在服务器日志中找到Error发生的日期
sed -n ‘/Error/p’ fresh.log|awk ‘{print $1}’
awk ‘/Error/{print $1} ‘ fresh.log
逻辑判断式
~,!~ 匹配正则表达式
==,!=,<,> 判断逻辑表达式
- 打印出passwd中第一个字段以m开头的所有行
awk -F ‘:’ ‘$1~/^m.*/{print $0}’ passwd
- 打印出passwd中第一个字段不以m开头的所有行
awk -F ‘:’ ‘$1!~/^m.*/{print $0}’ passwd
- 打印出passwd中uid大于20的所有行
awk -F ‘:’ ‘$3>20{print $0}’ passwd
扩展格式BEGIN…END
- 制表显示passwd 每行的行号,每列的列数,对应行的用户名
awk -F ‘:’ ‘BEGIN{print “line col user”}{printf(“%4s %3s %4s\n”,NR,NF,$1)}END{print”———-“FILENAME”———-“}’ passwd
- 统计当前文件夹下的文件/文件夹占用的大小
ll|awk ‘BEGIN{size=o}{size+=$5}END{print “size is “$5/1024 “Kb”}’
- 统计显示passwd中账户总人数
awk -F ‘:’ ‘BEGIN{count=0}$0!~/^$/{count++}END{print “count = ” count}’ passwd
- 统计显示uid大于100的用户名,并且重新编号显示
awk -F ‘:’ ‘BEGIN{count=1}{if($3>20) name[count++]=$1}END{for (i=1;i<count;i++)print i,name[i]}’ passwd - 统计netstat -anp状态下LISTENING和CONNECTED的连接数量
netstat -anp |grep ‘CONNECTED|LISTENING’|sed -n ‘s/^.STREAM//p’|awk ‘$1~/CONNECTED|LISTENING/{sum[$1]++}END{for (i in sum) print i” “sum[i] }’
- netstat -anp状态下LISTENING和CONNECTED的连接做个编号
netstat -anp |grep ‘CONNECTED|LISTENING’|sed -n ‘s/^.STREAM//p’|awk ‘BEGIN {count=1}$1~/CONNECTED|LISTENING/{type[count++]=$1} END {for (i=1;i<count;i++) print i”:”type[i]}’

留言