当前位置:   article > 正文

Shell 脚本系列 | shell三剑客

shell三剑客

1、三剑客介绍

"Shell三剑客"是指在Linux/Unix系统下使用最广泛的三个命令行工具:grep、sed和awk。它们都是文本处理工具,可以用于快速搜索、替换和处理大量文本数据。

命令特点使用场景
grep擅长查找过滤快速查找过滤
sed擅长取行和替换需要快速进行替换/修改文件内容
awk擅长取列、统计计算文件取列、数据切片、对比/比较和统计

shell三剑客通常要与正则表达式一起使用
下面是一些常用的正则表达式元字符:

.:匹配任意单个字符(除了换行符)。
*:匹配前面的字符0次或多次。
^:匹配行的开头。
$:匹配行的结尾。	
[ ]:匹配方括号中的任何一个字符。例如,[abc]匹配"a"、"b"或"c"。
[^ ]:匹配不在方括号中的任何字符。例如,[^0-9]匹配任何非数字字符。
{n,m}:最少匹配n次,最多匹配m次
|:或者。匹配|前后的任意一项。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2、三剑客之—grep

1. 常用参数

-n:显示行号;
-i:忽略大小写;
-o:精准匹配;
-f:从文件每一行获取匹配模式;
-c:统计匹配的行数;
-w:匹配 整个单词;
-E:使用扩展正则表达式,相当于egrep;
-F :相当于fgrep,就是将pattern视为固定字符串。
-v:反转查找,显示不被 pattern 匹配到的行,相当于[^] 反向匹配;
-A:后面可加数字,为 after 的意思,除了列出该行外,后续的 n 行也列出来;
-B:后面可加数字,为 before 的意思,除了列出该行外,前面的 n 行也列出来;
-C:后面可加数字,为context 的意思,除了列出该行外,前后的n行也列出来。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2. 常用示例

1.过滤以#开头的行和空白行
egrep -v "^#|^$"   文本文件  
  • 1
2.找出所有的mp3文件包含艺术家jayZ,不包含remix

//要找出艺术家jayZ的所有mp3格式的音乐文件,里面也不要有任何混合音轨-remix

find . -name ".mp3" | grep -i JayZ | grep -vi "remix"
  • 1
3.计算匹配项的数目
#类似于将grep输出的结果用管道传送给计数器(wc程序)
cat /etc/passwd| grep -c nologin
  • 1
  • 2

在这里插入图片描述

4.在匹配字符串周围打印出行
cat /etc/passwd| grep -A 2 mail #打印出前面匹配的n行
cat /etc/passwd| grep -B 2 mail #打印出后面匹配的n行
cat /etc/passwd| grep -C 2 mail #打印出两个方向都匹配的n行
  • 1
  • 2
  • 3

在这里插入图片描述

5.匹配显示所有IP
ip a|egrep  -o "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
  • 1

在这里插入图片描述

6.过滤以空白开头后跟#的行,以#开头的行,空白行

适合过滤helm包的 values.yaml

egrep -v "^\s*#|^#|^$" values.yaml
  • 1

在这里插入图片描述

3、三剑客之一sed

1.常用参数

 -n:不打印模式空间;
 -e:执行脚本、表达式来处理;
 -f:执行动作从文件读取执行;
 -i:修改原文件;
 -r:使用扩展正则表达式。
 
动作说明:
a:新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c:取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d:删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i:插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p:打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s:取代,通常这个 s 的动作可以搭配正规表示法,例如 1,20s/old/new/g 。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

2.常用示例

1. 奇数行后增加
echo -e "1\n2\n3\n4\n5" | sed "1~2 a www"
#1~2奇数,1~2!偶数
  • 1
  • 2

在这里插入图片描述

2. 删除注释的行
echo -e "#todo\ndef s\nputs 'b'\nend" | sed "/^#/d"
  • 1

在这里插入图片描述

3.插入

i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)

echo -e "1\n2\n3\n4\n5" | sed "1 i aaa"
  • 1

每一行插入 ‘

sed -i "s/^/\'/g"   test.txt
  • 1
4.替换
替换每行第一个is 为was:
sed 's/is/was/1' pets.txt
替换每行全部is为was 
sed 's/is/was/g' pets.txt
替换偶数行 is为was 
sed '1~2! s/is/was/g' pets.txt
覆盖原文件 
sed -i '1~2! s/is/was/g' pets.txt
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

注意:
在 sed 命令中,s 命令(即替换命令)使用斜杠 / 作为默认的分隔符。但是,如果待替换的文本中包含了斜杠字符 /,就会导致与默认分隔符冲突,进而影响命令的执行。
使用不同于默认分隔符的字符作为分隔符,可以避免这种冲突,确保命令的正确执行。
常见的替代分隔符包括 |、#、! 等。

4、三剑客之一awk

1.常用参数

-F	指定分割字段符
-v	定义或修改一个awk内部的变量
-f 	从脚本文件中读取awk命令
  • 1
  • 2
  • 3

内建变量

FS:列分隔符。指定每行文本的字段分隔符,默认为空格或制表位,与“ -F ”作用相同
 
OFS:输出分隔符。指定输出字段间的分隔符。
 
RS:行分隔符。awk从文件读取资料时,将根据RS的定义把资料切割为多条记录,
awk一次仅读取一条记录,以进行处理,预设值为 \n (换行符)
 
NF:当前处理行的字段个数
 
NR:当前处理行的行号
 
FNR:awk当前读取的记录数,其变量值小于等于NR
(比如当读取第二个文件时,FNR是从0开始重新计数,而NR不会)。
 
NR==FNR:用于在读取两个或两个以上的文件时,判断是不是在读取第一个文件
 
$0:当前处理行的整行内容
 
$n:当前处理行的第 n 个字段(第 n 列)
 
FILENAME:被处理的文件名
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

2.常用示例

1.自定义输出内容
awk,必须外层单引号,内层双引号

内置变量$1、$2都不得添加双引号,否则会识别文本,尽量别添加引号

awk -F: '{print "第一列",$1,"第二列",$2}' /etc/passwd
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

2.显示文件的第n行
#显示文件2-5行内容
awk 'NR==2,NR==5' passwd
  • 1
  • 2

在这里插入图片描述

#显示文件2-5行且输出行号
awk 'NR==2,NR==5 {print NR,$0}' passwd 
  • 1
  • 2

在这里插入图片描述

#显示文件的第一列,倒数第二和倒数第三列
awk '{print $1,$(NF-1)}' test.txt 
awk '{print $1,$(NF-1),$(NF-2)}' test.txt
  • 1
  • 2
  • 3

在这里插入图片描述
3.结果指定分隔符

#输出第1和第3个字段,输出结果默认以 空格 分隔
awk -F ":" '{print $1,$3 }' passwd
awk -F ":" '{print $1","$3 }' passwd
awk -F ":" '{print $1"=="$3 }' passwd
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.通过管道符、双引号调用shell命令

1.统计行数

awk -F ":" '/bash$/{print}' passwd 
root:x:0:0:root:/root:/bin/bash
y:x:1000:1000:y:/home/y:/bin/bash
lisi:x:1001:1001::/home/lisi:/bin/bash
#调用 wc -l 统计使用bash的行数
awk -F ":" '/bash$/{print|"wc -l"}' passwd 
3
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2.查看当前内存使用百分比

#查看当前内存使用百分比
free -m | awk '/Mem:/{print int($3/($3+$4)*100)"%"}'
87%
  • 1
  • 2
  • 3

3.查看当前cpu空闲率

# -b -n 1 表示只需要1次输出结果
top -b -n 1 | grep Cpu
%Cpu(s):  2.9 us,  2.9 sy,  0.0 ni, 96.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 
#输出cpu空闲率的字段
top -b -n 1 | grep Cpu | awk -F "," '{print $4}'
96.9 id
#输出Cpu空闲率
top -b -n 1 | grep Cpu | awk -F "," '{print $4}' | awk '{print$1}'
96.9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
4.BEGIN,END模式

BEGIN模式:在处理指定文本之前,需要先执行BEGIN模式中的指定的操作。

END模式:在处理指定文本结束后,需要执行END模式中的指定操作
在这里插入图片描述

#统计以 e 结尾的行
awk 'BEGIN{x=0}; /e$/{x++};END{print x}'
  • 1
  • 2

在这里插入图片描述


#统计以冒号分隔的文本段落数,END{}语句块中,往往会放入打印结果等语句
echo $PATH | awk 'BEGIN{RS=":"}{print NR,$0};END{print NR}'
  • 1
  • 2
  • 3

在这里插入图片描述
过滤文本中重复行数

cat b.txt
aaa
bbb
ccc
aaa
aaa
aaa
bbb
bbb
ccc
#将文本的内容作为数组下标,a[$1]++表示出现相同的行,就自加1
awk '{a[$1]++}END{for (i in a){print i,a[i]}}' b.txt
aaa 4
ccc 2
bbb 3
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/918806
推荐阅读
相关标签
  

闽ICP备14008679号