赞
踩
"Shell三剑客"是指在Linux/Unix系统下使用最广泛的三个命令行工具:grep、sed和awk。它们都是文本处理工具,可以用于快速搜索、替换和处理大量文本数据。
命令 | 特点 | 使用场景 |
---|---|---|
grep | 擅长查找过滤 | 快速查找过滤 |
sed | 擅长取行和替换 | 需要快速进行替换/修改文件内容 |
awk | 擅长取列、统计计算 | 文件取列、数据切片、对比/比较和统计 |
shell三剑客通常要与正则表达式一起使用
下面是一些常用的正则表达式元字符:
.:匹配任意单个字符(除了换行符)。
*:匹配前面的字符0次或多次。
^:匹配行的开头。
$:匹配行的结尾。
[ ]:匹配方括号中的任何一个字符。例如,[abc]匹配"a"、"b"或"c"。
[^ ]:匹配不在方括号中的任何字符。例如,[^0-9]匹配任何非数字字符。
{n,m}:最少匹配n次,最多匹配m次
|:或者。匹配|前后的任意一项。
-n:显示行号;
-i:忽略大小写;
-o:精准匹配;
-f:从文件每一行获取匹配模式;
-c:统计匹配的行数;
-w:匹配 整个单词;
-E:使用扩展正则表达式,相当于egrep;
-F :相当于fgrep,就是将pattern视为固定字符串。
-v:反转查找,显示不被 pattern 匹配到的行,相当于[^] 反向匹配;
-A:后面可加数字,为 after 的意思,除了列出该行外,后续的 n 行也列出来;
-B:后面可加数字,为 before 的意思,除了列出该行外,前面的 n 行也列出来;
-C:后面可加数字,为context 的意思,除了列出该行外,前后的n行也列出来。
egrep -v "^#|^$" 文本文件
//要找出艺术家jayZ的所有mp3格式的音乐文件,里面也不要有任何混合音轨-remix
find . -name ".mp3" | grep -i JayZ | grep -vi "remix"
#类似于将grep输出的结果用管道传送给计数器(wc程序)
cat /etc/passwd| grep -c nologin
cat /etc/passwd| grep -A 2 mail #打印出前面匹配的n行
cat /etc/passwd| grep -B 2 mail #打印出后面匹配的n行
cat /etc/passwd| grep -C 2 mail #打印出两个方向都匹配的n行
ip a|egrep -o "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
适合过滤helm包的 values.yaml
egrep -v "^\s*#|^#|^$" values.yaml
-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 。
echo -e "1\n2\n3\n4\n5" | sed "1~2 a www"
#1~2奇数,1~2!偶数
echo -e "#todo\ndef s\nputs 'b'\nend" | sed "/^#/d"
i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
echo -e "1\n2\n3\n4\n5" | sed "1 i aaa"
每一行插入 ‘
sed -i "s/^/\'/g" test.txt
替换每行第一个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
注意:
在 sed 命令中,s 命令(即替换命令)使用斜杠 / 作为默认的分隔符。但是,如果待替换的文本中包含了斜杠字符 /,就会导致与默认分隔符冲突,进而影响命令的执行。
使用不同于默认分隔符的字符作为分隔符,可以避免这种冲突,确保命令的正确执行。
常见的替代分隔符包括 |、#、! 等。
-F 指定分割字段符
-v 定义或修改一个awk内部的变量
-f 从脚本文件中读取awk命令
内建变量
FS:列分隔符。指定每行文本的字段分隔符,默认为空格或制表位,与“ -F ”作用相同 OFS:输出分隔符。指定输出字段间的分隔符。 RS:行分隔符。awk从文件读取资料时,将根据RS的定义把资料切割为多条记录, awk一次仅读取一条记录,以进行处理,预设值为 \n (换行符) NF:当前处理行的字段个数 NR:当前处理行的行号 FNR:awk当前读取的记录数,其变量值小于等于NR (比如当读取第二个文件时,FNR是从0开始重新计数,而NR不会)。 NR==FNR:用于在读取两个或两个以上的文件时,判断是不是在读取第一个文件 $0:当前处理行的整行内容 $n:当前处理行的第 n 个字段(第 n 列) FILENAME:被处理的文件名
awk,必须外层单引号,内层双引号
内置变量$1、$2都不得添加双引号,否则会识别文本,尽量别添加引号
awk -F: '{print "第一列",$1,"第二列",$2}' /etc/passwd
#显示文件2-5行内容
awk 'NR==2,NR==5' passwd
#显示文件2-5行且输出行号
awk 'NR==2,NR==5 {print NR,$0}' passwd
#显示文件的第一列,倒数第二和倒数第三列
awk '{print $1,$(NF-1)}' test.txt
awk '{print $1,$(NF-1),$(NF-2)}' test.txt
3.结果指定分隔符
#输出第1和第3个字段,输出结果默认以 空格 分隔
awk -F ":" '{print $1,$3 }' passwd
awk -F ":" '{print $1","$3 }' passwd
awk -F ":" '{print $1"=="$3 }' passwd
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
2.查看当前内存使用百分比
#查看当前内存使用百分比
free -m | awk '/Mem:/{print int($3/($3+$4)*100)"%"}'
87%
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
BEGIN模式:在处理指定文本之前,需要先执行BEGIN模式中的指定的操作。
END模式:在处理指定文本结束后,需要执行END模式中的指定操作
#统计以 e 结尾的行
awk 'BEGIN{x=0}; /e$/{x++};END{print x}'
#统计以冒号分隔的文本段落数,END{}语句块中,往往会放入打印结果等语句
echo $PATH | awk 'BEGIN{RS=":"}{print NR,$0};END{print NR}'
过滤文本中重复行数
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。