三剑客grep、sed、awk
一. grep
grep命令是一个Linux文本处理工具,它与egrep命令属于同一系列,这些命令都是用于对文件和文本执行重复搜索任务的工具。我们可以通过grep命令指定特定搜索条件来搜索文件及其内容以获取有用的信息。grep是全局搜索正则表达式并打印出匹配的行,其抓取数据是贪婪模式,即不会漏掉过滤内容,但准确性会相对降低。
-
cat test.txt | grep aaa 等效于 grep aaa test.txt
-
忽略大小写:-i,例如:cat test.txt | grep -i aaa
-
扩展正则表达式:-E,例如:grep -E "^ab|^da" grep.txt 匹配以ab或da开头的行
-
多条件
-
或:| ,例如:grep -E "^ab|^da" grep.txt 匹配以ab或da开头的行
-
与,多个grep,用管道|链接,例如:cat test.txt | grep ^d | grep d$ 匹配以d开头且以d结尾的行
-
非,见反向过滤
-
-
反向过滤:-v,例如:grep -v a test.txt 过滤文件中不包含a的行
-
举🌰
-
grep ^aa. grep.txt 匹配以aa开头的行
-
grep .aa$ grep.txt 匹配以aa结尾的行
-
ls -ll | grep ^- 展示当前目录所有的文件
-
cat grep.txt | grep d.d 匹配以d开头以d结尾且中间包含一个字符的行;cat grep.txt | grep -E d*d 匹配以d开头以d结尾且中间包含任意个字符的行;注意:当使用正则时,grep后需要添加-E
-
cat grep.txt | grep -E da+d 匹配以d开头以d结尾且中间至少包含一个a
-
常见正则字符:
-
元字符
代码
说明
.
匹配除换行符以外的任意字符
\w
匹配字母或数字或下划线或汉字
\s
匹配任意的空白符
\d
匹配数字
\b
匹配单词的开始或结束
^
匹配字符串的开始
$
匹配字符串的结束
-
重复
代码
说明
*
重复零次或更多次
+
重复一次或更多次
?
重复零次或一次
{n}
重复n次
{n,}
重复n次或更多次
{n,m}
重复n到m次
-
-
二. sed
sed 全名叫 stream editor即流编辑器,与 vim 的交互式编辑方式截然不同,作为一种非交互式编辑器,sed使用预先设定好的编辑指令对输入的文本进行编辑,完成之后输出编辑结果。其功能十分强大,加上正则表达式的支持,可以进行大量的复杂文本的编辑操作。
格式:sed 参数 命令 处理对象
-
显示:p,注意:不加-n参数时不仅显示文件的指定行,还会显示其他所有的行,-n参数只显示文件的指定行;例如:
-
sed -n 5p test.txt ##显示第5行
-
sed -n 3,5p test.txt ##显示第3行到第5行
-
sed -n "3p;5p" test.txt ##显示第3行和第5行
-
sed -n '5,$p' test.txt ##显示第5行到最后一行
-
sed -n '/^#/p' test.txt ##显示以#开头的行
-
-
删除:d,不会修改目标文件,只是将修改后的内容打印出来;例如:
-
sed 5d test.txt ##删除第5行
-
sed '/^#/d' test.txt ##把以#开头的行删除
-
sed '/^UUID/!d' test.txt ##删除不是以UUID开头的所有行
-
sed '5,$d' test.txt ##删除第5行到最后一行
-
-
添加:a,命令:sed "$line a\\(多加一个\,防止后面的$value被转义)$value" $file,不会改变文件自身;例如:
-
sed "2 a\\xxx" test.txt 表示在test.txt第二行插入xxx
-
-
插入:i,不改变文件自身
-
sed '3i heihei' test.txt ,在文件第三行插入heihei,并打印
-
-
替换:c,不会改变文件自身;例如:
-
sed '/^#/c hello world' fstab ##将所有以#开头的行替换为指定字符串
-
sed '5chello world' westos ##将第5行替换为指定字符串
-
-
写入文件:w
-
sed '/^a/w test1.txt' test.txt 把test.txt文件中a开头的行写入test1.txt文件中;等同于显示+重定向:sed -n '/^a/p' test.txt > test1.txt
-
-
整合文件:r,结合i参数,才会修改test.txt文件,如果不加i,test.txt文件不会被修改
-
sed '4r test1.txt' -i test.txt 将test1.txt文件内容整合到test.txt文件的第四行之后
-
三. awk
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
格式:awk -F 分隔符 BEGIN{}{}END{} filename
表达式 |
含义 |
---|---|
test |
#test变量值 |
"test" |
test字符串 |
/条件1|条件2/ |
#条件1或者条件2 |
/条件1/||/条件2/ |
#条件1或者条件2 |
/条件1/&&/条件2/ |
#条件1且条件2 |
$0 |
#所有的列 |
$1 |
#第一列 |
$2 |
#第二列 |
$3 |
#第三列 |
-
打印指定列
-
awk -F , 'BEGIN{print "begin"}{print $1}END{print "end"}' test.txt
-
解释:以逗号(,)为分隔符,打印test.txt的第一列数据,并在开头和结尾分别打印begin和end,注意命令行中begin和end需要添加双引号,否则会被当做变量处理
-
-
统计文件行数
-
awk -F , 'BEGIN{N=0}{N++}END{print N}' test.txt
-
解释:统计test.txt文件行数,分隔符位置用逗号或分号等其他符号都不影响,等效于:cat test.txt | wc -l
-
-
以逗号为分隔符,打印第一列
-
awk -F , '{print $1}' test.txt
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用