本文最后更新于 2024-10-16,文章内容可能已经过时。

grep 命令

grep 命令是我们常用的一个强大的文本搜索命令,以行为输出,只做筛选并输出,不会更改原文本的内容

命令格式:

grep [参数] [关键字] < 文件名 >

注意:

可以通过 grep --help 查看 grep 的帮助信息

参数详解:

  • -c 只输出匹配关键字的计数

  • -n 显示匹配行内容及行号

  • -v 显示不包含匹配文本的所有行

  • -o 只列出所匹配关键字

grep "root" /etc/passwd
ll /bin/ | grep "vim"
grep -c "zyl" /etc/passwd     #匹配相关内容的行计数
grep -n "root" /etc/passwd    #匹配有关匹配信息并输出行号
grep -v "root" /etc/passwd    #除了筛选内容不显示,其他都显示
grep -v "^#" /etc/sudoers | grep -v "^$"
grep -v "^#\|^$" /etc/sudoers

通配符:

  • ^ 以... 开头

  • $ 以... 结尾

  • ^$ 空行

  • \ 转义符

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 [参数] '< 匹配条件 > [动作]' [文件名]

注意

可以通过 sed --help 查看帮助信息

参数详解:

参数为空 表示 sed 的操作效果,实际上不对文件进行编辑

  • -n 取消静默输出

  • -i 表示对文件进行编辑

匹配条件

匹配条件分为两种:数字行号或者关键字匹配

关键字匹配格式:『/ 关键字 /』

动作详解

a 在匹配到的内容下一行增加内容

i 在匹配到的内容当前行增加内容

d 删除匹配到的内容

s 替换匹配到的内容

p 查看指定内容

e 多点编辑

查看

  sed -n '8p' sed     #查看第8行的内容
sed -n '1p;3p' sed    #查看第一行和第三行的内容
sed -n '1,3p' sed     #查看第一行到第三行的内容

替换

sed -i '1s/sed/SED/' sed                #第1行第1个sed替换为SED
sed -i '3s/sed/SED/2' sed               #第3行第2个sed替换为SED
sed -i '4s/sed/SED/g' sed               #第4行所有sed替换为SED
sed -i 's/sed/SED/' sed                 #每一行首个sed替换为SED
sed -i 's/sed/SED/g' sed                #所有sed替换为SED
sed -i '1,3s/SED/sed/g' sed             #第1-3行的所有SED替换为sed
sed -i '1,3s/SED/sed/' sed              #第1-3行的首个SED替换为sed
sed -i '4s/SED/sed/;6s/SED/sed/' sed    #第4和6行的首个SED替换为sed

插入

sed -i '2a\add-1' sed         #第2行后增加add-1
sed -i '2i\insert-1' sed      #sed第2行前插入insert-1
sed -i '2,4a\add-2' sed       #第2-4行每一行后增加add-2
sed -i '2,4i\insert-2' sed    #第2-4行每一行前增加insert-2

删除

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

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,$4}' awk  //输出第2列和第4列的内容

- 当前是什么作为分隔?  空格 --- 是默认情况下awk作为分隔条件

awk '{print NR,$4}' awk  //输出第四列的内容并显示行号

awk -F ',' '{print NR,$4}' awk  //以,作为分隔符,输出第四列的内容并显示行号

awk -F ',' 'BEGIN{OFS=":"} {print NR,$0}' 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  //逆循环

查询系统中 UID 为 0 的用户

awk -F ':' '{if($3==0) print $1}' /etc/passwd
awk -F ':' '$3==0{print $1}' /etc/passwd

查看空密码的用户

awk -F ':' 'length($2)==0 {print $1}' /etc/shadow
awk -F ':' '$2=="" {print $1}' /etc/shadow
awk -F: '($2=="") {print $1}' /etc/shadow
awk -F ':' '{if($2=="") print $1}' /etc/shadow