linux三大利器(grep/sed/awk)日常使用总结

在广大Linux用户的工具箱中,有三个神奇的利器,它们能够以令人惊叹的方式处理文本数据、日志文件、配置文件等等。这三个工具分别是grepsedawk。虽然它们各自有不同的功能和应用领域,但它们有一个共同点:它们都是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]}'