Linux文本处理工具----------grep&sed&awk

1.grep

grep 支持基本正则表达式
egrep 基础和扩展的正则表达式都支持
egrep = grep -E
grep命令是一个Linux文本处理工具,它与egrep命令属于同一系列,这些命令都是用于对文件和文本执行重复搜索任务的工具。我们可以通过grep命令指定特定搜索条件来搜索文件及其内容以获取有用的信息。grep是全局搜索正则表达式并打印出匹配的行,其抓取数据是贪婪模式,即不会漏掉过滤内容,但准确性会相对降低。

1.1grep 格式

grep 匹配条件 处理文件

grep 匹配条件 处理文件名称
grep root passwd ##过滤root关键字所在的行
grep -i root passwd ##忽略大小写过滤root关键字所在的行
grep -E “<root” passwd ##过滤root字符之前没有字符的行
grep -E “root>” passwd ##过滤root字符之后没有字符的行
grep -数字 ##显示过滤行以及上面几行和下面几行
grep -n ##显示匹配的行所在行号
grep -A数字 ##显示过滤行以及下面几行
grep -B数字 ##显示过滤行以及上面几行
grep -v ##反向过滤

实验:

cp /etc/passwd .
 ls
 vim passwd
grep root passwd       //搜索含有root关键字的行

grep -E "root|nologin" passwd
grep -e root -e nologin passwd //搜索含有root和nologin的行

grep -i root passwd     //忽略大小写

grep -E "\<root" passwd  //被搜索字符前不能有字符


grep -E "root\>" passwd  //被搜索字符后不能有字符

grep -n  halt passwd     //显示搜索字符所在行的行号

grep -5  halt passwd //显示含有关键字的行和含有关键字行的上下各5行  

grep -B5  halt passwd  //显示含有关键字的行及上5行

grep -A5  halt passwd   //显示含有关键字的行及下5行

grep  root passwd -v   //显示不含有root的行

在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述

1.2grep字符数量匹配规则

正则表达式 含义
^westos 以westos关键字开头
westos$ 以westos结尾
w…s w开头s结尾中间含有3个任意字符
…s s结尾前面有3个任意字符
* 字符出现次数任意(即0次到任意次)
? 字符出现0到1次
+ 字符出现1次到任意次
{n} 字符出现n次
{m,n} 字符出现m到n次
{,n} 字符出现0到n次
{m,} 字符最少出现m次
(lee){2} lee字符串出现2次
grep root passwd
grep ^root passwd   //以root开头
grep root$ passwd   //以root结尾

在这里插入图片描述
实验环境:

vim westos

cat westos
ws
was
wbs
waas
waaas
waaaas
wadads
wadadads

在这里插入图片描述

实验:
“ . ” 代表任意字符

grep ws westos
grep w.s westos
grep w..s westos
grep w...s westos

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述

2.sed

sed 全名叫 stream editor即流编辑器,与 vim 的交互式编辑方式截然不同,作为一种非交互式编辑器,sed使用预先设定好的编辑指令对输入的文本进行编辑,完成之后输出编辑结果。其功能十分强大,加上正则表达式的支持,可以进行大量的复杂文本的编辑操作。

命令格式:
sed 参数 命令 处理对象
sed 参数 处理对象 -f 处理规则文件

sed 's/nologin/westos/g' passwd
vim rule
cat rule
sed -f rule  passwd

在这里插入图片描述

1.1对字符的处理

p : 显示

sed 5p passwd                      //打印第五行
sed -n  5p passwd                 //只输出被处理内容
cat -b passwd | sed -n  3,5p      //3-5行
cat -b passwd | sed -n  '3p;5p'   //3和5行
sed -n  '/^root/p'  passwd        //root开头
sed -n  '/bash$/p' passwd         // bash结尾
sed -n  '5,$p' passwd             //  5到最后以行   
sed -n  '$p' passwd               //最后一行

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述d:删除

cat -b passwd | sed '5d'   删除第5行
cat -b passwd | sed '5,8d'      5-8行
cat -b passwd | sed -e '5d;8d'  5和8行
sed -e '/^root/d'  passwd          root开头 
sed -e '/bash$/d'  passwd         bash结尾
sed -e 'd'  passwd              删除全部

在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
a :添加



sed  '2aleo' westos   在第2行后添加

sed  '/hello/aleo' westos     在hello的下面添加

sed  '$aleo' westos    添加到最后一行

sed  '$aleo\nwestoslinux' westos  最后添加两行 leo、westoslinux

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
c :替换

sed  '1chhaha' westos  将第1行换成hhaha

sed  '/linux/chaha' westos  将linux换成haha

在这里插入图片描述w 把符合的行写到指定文件中
sed ‘/^UUID/w westofile’ westos ##把westos中UUID开头的行写入westosfile中
在这里插入图片描述
i :插入
sed ‘/westos/iwestosfile’ westos
在这里插入图片描述
r :整合文件

sed '2rlee' westos
sed '/hello/rlee' westos

在这里插入图片描述

2.2 sed 字符替换

sed 's/nologin/westos/g' passwd
sed '4,5s/nologin/westos/g' passwd
sed '$s/nologin/westos/g' passwd
sed '/lp/,/sssd/s/sbin/westos/g' passwd

sed 's/\//#####/g' passwd
 sed 's@/@#####@g' passwd     
sed 's@/@#####@g' -i passwd    //将更改的内容保存到源文件

将全文的nologin替换成westos
在这里插入图片描述
将4,5行的nologin替换成westos
在这里插入图片描述

将最后一行的nologin替换成westos
在这里插入图片描述将lp到sssd之间的sbin替换成westos
在这里插入图片描述

将/替换成#####
在这里插入图片描述将/替换成#####
在这里插入图片描述

3.awk

在这里插入图片描述字符 含义
NR 行数
NF 列数
FILENAME 文件名称本身
westos 变量值
“westos” 字符串

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述设定westos=1,每处理一行westos+1,最后输出总值
在这里插入图片描述

awk -F : '/nologin$|{print $1,$7}' passwd
/bash$/      #条件

awk -F : '/nologin$|^root/{print $1,$7}' passwd
/条件1|条件2/    #条件1或者条件2

awk -F : '/nologin$/||/^root/{print $1,$7}' passwd
/条件1/||/条件2/  #条件1或者条件2

wk -F : '/bash$/&&/^root/{print $1,$7}' passwd
/条件1/&&/条件2/  #条件1并且条件2
$0#所有的列
$1#第一列
$2#第二列
$3#第三列

显示第七列是以bash结尾的
在这里插入图片描述
课后练习:命令练习:统计在系统中能su切换的且用户家目录不在/home下的用户数量
思路:使用awk命令以:为分隔符截取/etc/passwd文件中第六列不以/home开头的(/需要转译;不能直接写不含有home关键字,存在类似用户家目录为/tmp/home这种情况)、并且以bash或sh结尾的行,对截取结果进行计数

awk -F : 'BEGIN{N=0}$6!~/^\home/&&/bash$|sh$/{N++}END{print N}' /etc/passwd

猜你喜欢

转载自blog.csdn.net/weixin_46971894/article/details/119719601