1200 字
6 分钟
Linux 三剑客(grep/sed/awk)

Linux文本三剑客#

1 grep#

演示文本:
/etc/passwd
以行为输出,只做筛选并输出,不会改变文件原来的内容
grep命令是我们常用的一个强大的文本搜索命令。
命令格式:
grep [参数] [关键字] <文件名>
注意:
可以通过 grep --help 查看grep的帮助信息
参数详解:
c 只输出匹配关键字的计数
n 显示匹配行内容及行号
v 显示不包含匹配文本的所有行
o 只列出所匹配关键字
grep -v "^#" /etc/sudoers | grep -v "^$" //筛选以#开头和空行以外的内容
grep -v "^#\|^$" /etc/sudoers
^ 以...开头
$ 以...结尾
^$ 空行
\ 转义符

2 sed#

演示文本:
hello sed1 sed1 sed1
hello sed2 sed2 sed2
hello sed3 sed3 sed3
hello sed4 sed4 sed4
hello sed5 sed5 sed5
hello sed6 sed6 sed6
hello sed7 sed7 sed7
hello sed8 sed8 sed8
行文本编辑工具
sed 行文件编辑工具。因为它编辑文件是以行为单位的。
命令格式:
sed [参数] '<匹配条件> [动作]' [文件名]
注意:
可以通过 sed --help 查看帮助信息
参数详解:
参数为空 表示sed的操作效果,实际上不对文件进行编辑
-n 取消静默输出
-i 表示对文件进行编辑
匹配条件:
匹配条件分为两种:数字行号或者关键字匹配
关键字匹配格式:
‘/关键字/’
动作详解:
a 在匹配到的内容下一行增加内容
i 在匹配到的内容当前行增加内容
d 删除匹配到的内容
s 替换匹配到的内容
p 查看指定内容
e 多点编辑

查看

sed -n '3p' sed //查看第三行的内容
sed -n '3p;5p' sed //查看第三行和第五行的内容
sed -n '2,5p' sed //查看2-5行的内容

替换

sed -i '1s/sed/SED/' sed //将第一行第一个sed替换为SED
sed -i '1s/sed/SED/2' sed //将第一行第二个sed替换为SED
sed -i '3s/sed/SED/g' sed //将第三行所有sed替换为SED
sed -i 's/sed/SED/' sed //将每一行首个sed替换为SED
sed -i '6,8s/sed/SED/g' sed //将6-8行所有sed替换为SED
sed -i '2s/sed/SED/g;5s/sed/SED/g' sed //将第2和5行所有sed替换为SED

增加

1.在第2行后增加add-1
sed -i '2a\add-1' sed
2.在第2行前增加insert-1
sed -i '2i\insert-1' sed
3.在第5-7行后每一行增加add-2
sed -i '5,7a\add-2' sed
4.在第5-7行前增加insert-2
sed -i '5,7i\insert-2' sed
5.在第1行后连续增加两行
sed -i '1a\add-11\nadd-11' sed

删除

删除第2行
sed -i '2d' sed
删除第2-5行
sed -i '2,5d' sed
删除第2和5行
sed -i '2d;5d' sed

3 awk#

演示文本:
hello awk1 awk2 awk3
hello awk4 awk5 awk6
Hello awk7 awk8 awk9
不仅能以行为单位,也能以列为单位处理文件
awk是一个功能非常强大的文档编辑工具,它不仅能以行为单位还能以列为单
位处理文件。
命令格式
awk [参数] '[动作]' [文件名]
常见参数:
-F 指定列的分隔符
-f 调用脚本
-v 定义变量
常见动作:
print 显示内容
$0 显示当前行所有内容
$n 显示当前行的第n列内容
动作组成
BEGIN{ 命令 } 初始代码块,主要和变量相关
/pattern/{ 命令 } 匹配、执行代码块
END{ 命令 } 结束代码块,主要和信息输出相关
内置变量
FILENAME 当前输入文件的文件名,该变量是只读的
NR 指定显示行的行号
NF 输出当前行的列数
OFS 输出格式的列分隔符,缺省是空格
FS 输入文件的列分融符,缺省是连续的空格和Tab
awk '/hello/' awk //筛选有hello的内容
awk '{print $2}' awk //打印第2列内容
默认情况下awk会以空格作为分隔符
awk '{print NR,$2}' awk //打印第二列的内容并显示行号
awk 'NR==2{print $2,$4}' awk //打印第二行的内容的第二列和第四列的内容
awk -F ',' '{print $3}' awk //以,为分隔符,打印第三列的内容
awk -F ',' 'BEGIN{OFS=":"}{print NR,$2}' awk //以,为分隔符,打印 行号:第二列的内容
ll | awk '{if ($5>=1910) print "\n" "filename:" $9 "\n" "lenth:" $5 "B" "\n"}' //输出当前目录下文件大小大于1910的文件名和文件大小
ll | awk '{if ($5>=1910 && /^-/) print "\n" "filename:" $9 "\n" "lenth:" $5 "B" "\n"}' //输出当前目录下普通文件大小大于1910的文件名和文件大小
awk -F ',' '{for(i=1;i<=NF;i++) print $i}' awk //按顺序输出所有内容
awk -F ',' '{for(i=NF;i>=1;i--) print $i}' awk //按倒序输出所有内容
1.查询系统中UID为0的用户
awk -F ':' '$3==0{print $1}' /etc/passwd
2.查询空密码的用户
awk -F ':' '$2==""{print $1}' /etc/shadow
awk -F ':' 'length($2)==0{print $1}' /etc/shadow
Linux 三剑客(grep/sed/awk)
https://wangyi187.top/posts/os-13-linux-three-swords/
作者
WangYi
发布于
2024-07-27
许可协议
CC BY-NC-SA 4.0