linux三剑客sed、grep、awk
linux中最重要的三个命令称为三剑客,分别是sed、grep、awk
但是在学习这三个命令之前,首先需要了解一下正则表达式
1.正则表达式
元字符 | 功能 | 含义 |
^ | 匹配行首 | 表示以某个字符开头 |
$ | 匹配行尾 | 表示以某个字符结尾 |
^$ | 空行 | 表示空行的意思 |
. | 匹配任意单个字符 | 表示任意一个字符 |
* | 匹配0或多个重复字符 | 表示重复的任意多个字符 |
\ | 屏蔽一个元字符的特殊含义 | 表示去掉有意义的元字符的含义 |
[] | 匹配中括号内的字符 | 表示过滤括号内的字符 |
.* | 匹配任意多个字符 | 就是代表任意多个字符 |
lele\{n\} | 用来匹配前面lele出现次数。n为次数 | 就是统计前面lele出现的次数 |
lele\{n,\} | 含义同上,但次数最少为n | 从功能就可以看出 |
lele\{n,m\} | 同上,但lele出现次数在n与m之间 | 从功能也可以看出 |
2.sed
sed 命令是利用脚本来处理文本文件。
sed 可依照脚本的指令来处理、编辑文本文件。
Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。
语法:
sed [-hnV][-e<script>][-f<script文件>][文本文件]
参数说明
- -e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
- -f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
- -h或--help 显示帮助。
- -n或--quiet或--silent 仅显示script处理后的结果。
- -V或--version 显示版本信息。
动作说明
- a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
- c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
- d :删除,因为是删除啊,所以 d 后面通常不接任何东东;
- i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
- p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
- s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正则表达式!例如 1,20s/old/new/g 就是啦!
实例
先创建一个testfile文件,内容如下:
HELLO LINUX! Linux is a free unix-type opterating system. This is a linux testfile! Linux test Google Taobao Runoob Tesetfile Wiki
然后需要使用sed对第四行下一行添加一行的操作
[root@gjm ssstr]# sed -e 4a\newLine testfile HELLO LINUX! Linux is a free unix-type operating system. This is a linux testfile! This is a linux testfile! newLine Linux test Google Taobao Runoob Tesetfile Wiki [root@gjm ssstr]# sed -e 4a\newLine testfile -n newLine
如果加上-n参数则只显示受到修改的一行
然后将testfile的内容列出并且列印行号,同时删除2-5行
[root@gjm ssstr]# nl testfile | sed '2,5d' 1 HELLO LINUX! 6 Google 7 Taobao 8 Runoob 9 Tesetfile 10 Wiki
-e参数可以不写,但是不写的情况,后面的操作需要加上‘...’单引号包起来
只删除第二行
[root@gjm ssstr]# nl testfile | sed '2d' 1 HELLO LINUX! 3 This is a linux testfile! 4 This is a linux testfile! 5 Linux test 6 Google 7 Taobao 8 Runoob 9 Tesetfile 10 Wiki
删除第三行到最后一行
[root@gjm ssstr]# nl testfile | sed '3,$d' 1 HELLO LINUX! 2 Linux is a free unix-type operating system.
在第二行后加入drink tea?字样
[root@gjm ssstr]# nl testfile | sed '2a drink tea?' 1 HELLO LINUX! 2 Linux is a free unix-type operating system. drink tea? 3 This is a linux testfile! 4 This is a linux testfile! 5 Linux test 6 Google 7 Taobao 8 Runoob 9 Tesetfile 10 Wiki
如果是第二行前
[root@gjm ssstr]# nl testfile | sed '2i drink tea?' 1 HELLO LINUX! drink tea? 2 Linux is a free unix-type operating system. 3 This is a linux testfile! 4 This is a linux testfile! 5 Linux test 6 Google 7 Taobao 8 Runoob 9 Tesetfile 10 Wiki
如果增加两行以上
[root@gjm ssstr]# cat testfile | sed '2a Drink tea or ...\ndrink beer?' HELLO LINUX! Linux is a free unix-type operating system. Drink tea or ... drink beer? This is a linux testfile! This is a linux testfile! Linux test Google Taobao Runoob Tesetfile Wiki
替换与显示
将第2-5行的内容替换成No 2-5 number
[root@gjm ssstr]# nl testfile | sed '2,5c No 2-5 number' 1 HELLO LINUX! No 2-5 number 6 Google 7 Taobao 8 Runoob 9 Tesetfile 10 Wiki
显示文件的第5-7行
[root@gjm ssstr]# nl testfile | sed '5,7p' 1 HELLO LINUX! 2 Linux is a free unix-type operating system. 3 This is a linux testfile! 4 This is a linux testfile! 5 Linux test 5 Linux test 6 Google 6 Google 7 Taobao 7 Taobao 8 Runoob 9 Tesetfile 10 Wiki [root@gjm ssstr]# nl testfile | sed '5,7p' -n 5 Linux test 6 Google 7 Taobao
这里最好加上-n参数,不然比较难看清楚
数据搜索并显示
搜索与oo关键字的行
[root@gjm ssstr]# nl testfile | sed -n '/oo/p' 6 Google 8 Runoob
数据搜寻并删除
删除了所有包含oo关键字的行,输出其他行
[root@gjm ssstr]# nl testfile | sed '/oo/d' 1 HELLO LINUX! 2 Linux is a free unix-type operating system. 3 This is a linux testfile! 4 This is a linux testfile! 5 Linux test 7 Taobao 9 Tesetfile 10 Wiki
数据搜寻并执行命令
找到有oo关键词的行,执行花括号中的一组命令,每个命令之间用分号分割,这里把oo替换为kk,在输出
[root@gjm ssstr]# nl testfile | sed -n '/oo/{s/oo/kk/;p;q}' 6 Gkkgle
将查询出的ip取出来
[root@gjm ssstr]# ip a s ens33 | sed '3p' 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:14:7d:cc brd ff:ff:ff:ff:ff:ff inet 192.168.10.144/24 brd 192.168.10.255 scope global noprefixroute dynamic ens33 inet 192.168.10.144/24 brd 192.168.10.255 scope global noprefixroute dynamic ens33 valid_lft 1151sec preferred_lft 1151sec inet6 fe80::3a7c:e2d1:fff4:da11/64 scope link noprefixroute valid_lft forever preferred_lft forever
[root@gjm ssstr]# ip a s ens33 | sed '3p' -n | sed 's/brd.*//g' | sed 's/^.*net //g' 192.168.10.144/24
注意,如果加上-i则会很危险,会对文件直接进行操作
3.grep
文本过滤(模式:pattern)工具,grep, egrep grep [OPTIONS] PATTERN [FILE...] --color=auto 对匹配到的文本着色显示 -v 显示不被pattern匹配到的行 -i 忽略字符大小写 -n 显示匹配的行号 -c 统计匹配的行数 -o 仅显示匹配到的字符串 -q 静默模式,不输出任何信息 -A # after, 后#行 -B # before, 前#行 -C # context, 前后各#行 -e 实现多个选项间的逻辑or关系 grep –e ‘cat ’ -e ‘dog’ file -w 匹配整个单词 -E 使用ERE,相当于egrep -F 相当于fgrep,不支持正则表达式
查找文件内容包含root的行数
[root@gjm ssstr]# grep -n root passwd 1:root:x:0:0:root:/root:/bin/bash 10:operator:x:11:0:operator:/root:/sbin/nologin
查找文件内容不包含root的行
[root@gjm ssstr]# grep -nv root passwd 2:bin:x:1:1:bin:/bin:/sbin/nologin 3:daemon:x:2:2:daemon:/sbin:/sbin/nologin 4:adm:x:3:4:adm:/var/adm:/sbin/nologin 5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6:sync:x:5:0:sync:/sbin:/bin/sync 7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8:halt:x:7:0:halt:/sbin:/sbin/halt
查找以s开头的行
[root@gjm ssstr]# grep -n ^s passwd 6:sync:x:5:0:sync:/sbin:/bin/sync 7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 14:systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin 20:saslauth:x:996:76:Saslauthd user:/run/saslauthd:/sbin/nologin 34:setroubleshoot:x:991:985::/var/lib/setroubleshoot:/sbin/nologin 35:saned:x:990:984:SANE scanner daemon user:/usr/share/sane:/sbin/nologin 38:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
查找以n结尾的行
[root@gjm ssstr]# grep -n n$ passwd 2:bin:x:1:1:bin:/bin:/sbin/nologin 3:daemon:x:2:2:daemon:/sbin:/sbin/nologin 4:adm:x:3:4:adm:/var/adm:/sbin/nologin 5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10:operator:x:11:0:operator:/root:/sbin/nologin 11:games:x:12:100:games:/usr/games:/sbin/nologin
4.awk
报告生成器,格式化文本输出,有多种版本:New awk(nawk),GNU awk( gawk)
awk [-F|-v] '行数筛选{XXX;XXX;printf “”,XXX,XXX}'
-F
指明输入时用到的字段分隔符-v var=value
自定义变量
awk执行时,由分隔符分隔的字段(域)标记1,1,2..n称为域标识,n称为域标识,0为所有域。
省略action,则默认执行 print $0 的操作。
FS:输入字段分隔符;OFS:输出字段分隔符;RS:输入记录分隔符;ORS:输出记录分隔符;NF:字段数量;NR:记录号;NFR:各文件分别计数,记录号。FILENAME:当前文件名;ARGC:命令行的参数;ARGV:数组,保存的是命令行所给定的各参数
printf命令
printf “FORMAT” , item1, item2, ...
不会自动换行,FORMAT中需要分别为后面每个item指定格式符。
格式符 | Item表现形式 |
%c | 显示字符的ASCII码 |
%d,%i | 显示十进制整数 |
%e,%E | 显示科学计数法数值 |
%f | 显示为浮点数 |
%g,%G | 以科学计数法或赋点形式显示数值 |
%s | 显示字符串 |
%u | 无符号整数 |
%% | 显示%自身 |
格式符 | Item |
#[.#] | 第一个数字控制显示的宽度;第二个#表示小数点后精度,%3.1f |
- | 左对齐(默认右对齐)%-15s |
+ | 显示数值的政府符号%+d |
算术操作符:x+y, x-y, x*y, x/y, x^y, x%y
-x: 转换为负数
+x: 转换为数值
比较操作符:==, !=, >, >=, <, <=
模式匹配符:~:左边是否和右边匹配包含 !~:是否不匹配
逻辑操作符:与&&,或||,非!
函数调用:function_name(argu1, argu2, ...)
条件表达式(三目表达式):selector?if-true-expression:if-false-expression
PATTERN:根据pattern条件,过滤匹配的行,再做处理
如果未指定:空模式,匹配每一行
/regular expression/:仅处理能够模式匹配到的行,需要用/ /括起来
relational expression: 关系表达式,结果为“真”才会被处理
line ranges:行范围 startline,endline:/pat1/,/pat2/不支持直接给出数字格式
BEGIN/END模式
awk控制语句
1.{ statements;… } 组合语句
2.if(condition) {statements;…}
3.if(condition) {statements;…} else {statements;…}
4.while(conditon) {statments;…}
5.do {statements;…} while(condition)
6.for(expr1;expr2;expr3) {statements;…}
7.break
8.continue
9.delete array[index]
10.delete array
11. exit
打印文件第一列
[root@gjm ssstr]# awk -F ':' '{print $1}' passwd root bin daemon adm lp sync shutdown halt mail
输出字符1,3,6,以制表符作为分隔符
[root@gjm ssstr]# awk -F : '{print $1,$2,$3,OFS="\t"}' passwd root x 0 bin x 1 daemon x 2 adm x 3 lp x 4 sync x 5
查询到ip地址并使用awk取出来
[root@gjm ssstr]# ip a s ens33 | grep -v inet6 | grep inet| awk -F " " '{print $2}' 192.168.10.144/24
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY