Unlock the Power of Linux’s Triple Threat: grep, sed, and awk
This comprehensive guide introduces the Linux “three swords”—grep, sed, and awk—explaining regular expressions, metacharacters, and practical command syntax, while providing examples, options, and advanced usage tips to boost efficiency in text processing and system administration.
Linux三剑客及使用介绍
Linux 三剑客是(grep,sed,awk)三者的简称,熟练使用这三个工具可以提升运维效率。Linux 三剑客以正则表达式作为基础,而在 Linux 系统中,支持两种正则表达式,分别为“标准正则表达式”和“扩展正则表达式”。在掌握好正则表达式后,将具体讲解三剑客的用法。
一、正则表达式
正则表达式:REGular EXPression, REGEXP。我们通过特定的字符串匹配模板,来获取到所需的内容。熟练掌握好正则表达式是使用 Linux三剑客 的前提啊。
元字符
.: 匹配任意单个字符; []: 匹配指定范围内的任意单个字符; [^]: 匹配指定范围外的任意单个字符;
字符集合
[[:digit:]]:匹配单个数字; [[:lower:]] :匹配单个小写字母; [[:upper:]] :匹配单个大写字母; [[:punct:]] :匹配单个标点字符; [[:space:]] :匹配单个空白字符; [[:alpha:]] :匹配单个字母; [[:alnum:]] :匹配单个字母或数字;
匹配次数(贪婪模式)
*:匹配其前面的字符任意次 ? :匹配其前面的字符0次或者1次 + :匹配其前面的字符至少1次 .* :任意长度的任意字符
位置锚定
^: 锚定行首; $: 锚定行尾; ^$: 空白行。
Linux实际使用
由于 Linux 系统 shell 解释器的特殊处理,某些元字符在 Linux 下具有展开式等特殊含义,在实际的使用过程中我们需要添加 \ 进行转义。
备注:至少0次,必须要显示的写出来;
二、拓展正则表达式
可以看到标准正则表达的使用过程中,许多符号都需要转义,这在工作中带来了一定的不便,因此扩展的正则表达式便出现了。
字符匹配:
.:匹配单个字符; [abc] :包含 abc 任意一个字符; [^abc] :不包含 abc 任意一个字符。
次数匹配(不用再转义):
*:匹配前一个字符任意次; ? :匹配其前面的字符1次或0次; + :匹配其前面的字符至少1次; {m,n} :匹配其前面的字符至少 m 次,至多 n 次。
位置锚定:
对比使用方式: ^ 和 $ 。这里要注意的是对于词首定位和词尾定位,分别是 \< 和 \> ,依然需要加上反斜杠。
或运算
|: 可以同时取并集;
注意:C|cat 表示的是 C 或 cat(表示的是整个部分)
使用扩展的正则表达式可以省略很多的转义符号,这尤其在写 sed 语句时极大的提高了代码的可读性。建议优先使用扩展的正则表达式。
三、grep命令家族
3.1. grep相关命令
grep 命令家族由 grep、egrep、fgrep 三个子命令组成,适用于不同的场景。
grep:原生的 grep 命令,使用“标准正则表达式”。
egrep:相当于 $(grep -E) ,使用“扩展正则表达式”。
fgrep:简化版的 grep 命令,不支持正则表达式,但搜索速度快,系统资源使用率低。
3.2. 使用方法
语法 grep [options] PATTERN [FILE...] options 部分 -i :忽略大小写 --color :高亮匹配上的字符串 -v :显示没有被模式匹配到的行 -o :只显示被模式匹配到的字符串 -E :使用扩展的正则表达式,egrep = grep -E
PATTERN 部分 以字符串的方式给定匹配模板,可以使用普通字符串以及正则表达式(标准&扩展)。
FILE 部分 需要查找内容的文件。
四、sed命令
4.1. 概述
sed 全称为 Stream EDitor,sed 是一个流编辑器,在处理行内容时功能十分强大。
4.2 基本语法
sed [option] 'script' [input file]...1. option 部分
-n:不输出模式空间中未匹配上的内容 stdout。 -e :可以在 sed 命令中指定多个 script 脚本,多点编辑功能。 -f :输入 sed 脚本,脚本中写着编辑命令。 -r :支持使用扩展的正则。 -i :直接编辑源文件。
2. script 部分
script 部分包含两个内容,其一是定界,即确定我们要操作的范围。另一个内容是操作,比如替换、插入当前行或在后面插入等操作。
a) 定界-空地址
即全文编辑;
b) 定界-单地址:
n:指定第 n 行,对特定行进行编辑;例: sed -n '1p' passwd 仅输出第一行。 /pattern/ :指定模式匹配到的那一行,需要使用 -r 选项才能使用扩展正则。
c) 定界-范围:
n,m:定位从第 n 行开始至第 m 行(闭区间)。 n,+k :定位从第 n 行开始,包括往后的 k 行。 n,/pattern/ :定位从第 n 行开始,至指定模式匹配到的那一行。 /pattern1/,/pattern2/ :定位从 pattern1 模式匹配开始,直到 pattern2 模式匹配之间的范围。
d) 定界-步进方式:
1~2:以 1 为起始行,然后步进 2 行向下匹配,即所有的奇数行。 2~2 :以 2 为起始行,然后步进 2 行向下匹配,即所有的偶数行。
e) 编辑操作:
d:删除整行。 p :显示模式空间中的内容。 a :在匹配的行后面增加文本,支持多行追加。 i :在匹配的行前面增加文本。 c :替换匹配行为指定的文本。 w :保存模式空间中匹配的内容到指定位置。 r :读取指定文件的内容添加到当前文件匹配到的行后面。 ! :条件取反。 s/// :条件替换,分隔符可以使用其他符号,例如 sed 's@root@me@g' /etc/passwd 。
替换标记备注:g(全局替换),p(显示替换成功的行)
4.3. sed 高级用法
1. 模式空间与保持空间
在模式空间中,完成匹配的操作。当没有匹配上的时候,文本行内容会默认输出 stdout;当匹配上文本行的时候,会执行编辑命令,执行结果输出到 stdout 中。保持空间可以理解为一个暂存区,只是用于完成额外的动作。
2. 相关参数
h:把模式空间中的内容覆盖至保持空间中; H :把模式空间中的内容追加至保持空间中; g :把保持空间中的内容覆盖至模式空间中; G :把保持空间中的内容追加至模式空间中; x :把模式空间与保持空间互换; n :读取匹配到的行的下一行覆盖模式空间; N :追加读取匹配到的行的下一行至模式空间; d :删除模式空间中的行; D :删除多行模式空间中的所有行。
3. 举例
sed -n 'n;p' FILE:显示偶数行。 sed '1!G;h;$!d' FILE :逆序显示文件的内容。 sed '$!d' FILE :取出最后一行。 sed '\$!N;$!D' FILE :取出文件后两行。 sed '/^$/d;G' FILE :删除空白行并在非空行后添加空白行。 sed 'n;d' FILE :显示奇数行。 sed 'G' FILE :在每行后方添加一个空白行。
4. 基础面试题举例
面试题1:提取字符串中的指定字符串
/bin/bash
info="hellozimskyshenzhen"
echo $info | sed 's/hello\(\w\+\)shenzhen/\1/g'注意事项:sed 中不支持 \d,使用 [0-9] 表示数字;\w、()、+、<> 需要转义,使用 -r 选项可直接使用扩展正则。
面试题2:判断输入是否为整数
#!/bin/bash
if [ -n "$(echo $1 | sed -n '/^[0-9]\+$/p')" ]; then
echo 'yes'
else
echo 'no'
fi五、awk命令
5.1. awk概述
awk 是三个作者姓名首字母的缩写,是一个报表生成器,主要用于格式化输出。
5.2. 基本用法
1. 语法
awk [option] 'PATTERN{ACTION STATEMENTS}' FILEawk 按行读取文档,根据输入分隔符切分成字段,用 $0、$1、$2 等表示整行或各字段,ACTION STATEMENTS 处理该行文本。
2. 常用选项
-F:指定输入字段分隔符; -v:自定义变量 var=value。
3. PATTERN(用于定界)
空模式 `` 表示处理所有行; /pattern/ 表示处理匹配的行; !/pattern/ 表示处理不匹配的行;关系表达式如 NR>2 返回布尔值;列限定如 $1=/bin/ 、 $1~/dae/ 等。
4. 内建变量
FS、OFS、RS、ORS、NF、NR、FNR、FILENAME、ARGC、ARGV 等。
5. 常用 ACTION 命令
print:输出格式,print item1,item2 …
printf:格式化输出,printf FORMAT, item1, item2 …
表达式、控制语句(if、while、for 等)、数组操作等。
6. 自定义变量
方法1:-v var=value;方法2:在程序中定义变量。
7. 示例
列出所有使用 /bin/bash 的用户: awk -F: '$NF=="/bin/bash" {print $1, $NF}' /etc/passwd 统计文件中每个 IP 的出现次数:
awk '{ip[$1]++} END{for (i in ip) print i, ip[i]}' access.logSigned-in readers can open the original source through BestHub's protected redirect.
This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactand we will review it promptly.
Raymond Ops
Linux ops automation, cloud-native, Kubernetes, SRE, DevOps, Python, Golang and related tech discussions.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.
