Shell 中文本的处理工具

Shell 中文本的处理工具

1. grep

全称:Globally search a Regular Experssion and Print

grep -E = egrep 是等同的效果

grep 格式

  1. grep 匹配条件 处理文件
命令含义
grep root passwd过滤关键字
grep ^root passwd以 root 开头
grep root$ passwd以 root 结尾

先准备一个实验文件,如图所示的文件内容;
输入命令 grep root zxkfile,在该文件中查找包含 root 关键字的行;
输入命令 grep ^root zxkfile,查找以 root 开头的行;
输入命令 grep root$ zxkfile,查找以 root 结尾的行;
结果如图所示:

在这里插入图片描述

参数含义
-i关键字不区分大小写
-E
-数字显示过滤行以及上面和下面几行
-n显示匹配的行所在行号
-A显示过滤行以及下面几行
-B显示过滤行以及上面几行
-v反向过滤
-E “<root” passwdroot 字符之前不能有字符
-E “root>" passwdroot 字符之后不能有字符

输入命令

在这里插入图片描述

在这里插入图片描述
输入命令查看 kkkfile 文件的内容,该文件中包含大小写;
输入命令 grep zxk kkkfile,过滤出 zxk 关键字;
输入命令 grep -i zxk kkkfile,忽略大小写来过滤 zxk 关键字;
输入命令 grep -i zxk kkkfile -v,忽略大小写来反向过滤;

在这里插入图片描述

  1. grep 字符数量匹配规则
字符含义
^westos以 westos 开头
westos$以 westos 结尾
w…s以 w 开头 s 结尾,中间有四个字符
…ss 结尾前面有5个字符
*字符出现任意
0到1次
+1次到任意次
{n}n 次
{m,n}m 到 n 次
{0,n}0 - n 次
{,n}0 - n 次
{m,}最少 m 次
(lee){2}lee字符串出现2次

编辑一个实验文件,如图所示:
输入命令 grep ^wa 123 ,表示过滤以 wa 开头的行;
输入命令 grep es$ 123 ,表示过滤以 es 结尾的行;

在这里插入图片描述

输入命令 grep w…s 123 ,表示过滤以 w 开头,s 结尾中间有两个字符的行;
输入命令 grep w…s 123 ,表示过滤以 w 开头,s 结尾中间三个字符的行;

在这里插入图片描述

输入命令 grep “w.*s” 123 ,表示过滤以 w 开头,s 结尾中间任意个字符的行;

在这里插入图片描述
输入命令 grep -E “w.{3}s” 123,表示过滤以 w 开头,s 结尾中加有三个字符的行;第一个没有查到结果,因为中间是特殊字符,需要加上参数 -E ;
输入命令 grep -E “w.?s” 123,表示过滤以 w 开头,s 结尾中间0到1个字符的行;
输入命令 grep -E “w.+s” 123,表示过滤以 w 开头,s 结尾中间有一次到任意次的字符的行;

在这里插入图片描述
输入命令 grep -E “w.{2,}s” 123,表示过滤以 w 开头,s 结尾中间有两个以上字符的行;
输入命令 grep -E “w.{,3}s” 123,表示过滤以 w 开头,s 结尾中间有三个以下字符的行;
输入命令 grep -E “w.{0,3}s” 123,表示过滤以 w 开头,s 结尾中间有0到三个字符的行;
输入命令 grep -E “w(ae){1,}s” 123,表示过滤以 w 开头,s 结尾中间有一个以上 ae 字符的行.

在这里插入图片描述

2. sed

命令格式:

  • sed 参数 命令 处理对象
  • sed 参数 处理对象 -f 处理规则文件
  1. 对字符的处理
  • P显示
p显示
sed -n 5p westos显示第 5 行
sed -n 3,5p westos显示3到5行
sed -ne “3p;5p” westos显示3和5行
sed -ne 1,5p westos显示1到5行
sed -ne ‘5,$p’ westos5到最后一行
sed -n ‘/^#/p’ fatab显示以#开头的行

编辑一个模板文件来观察实验效果;
输入命令 cat -b fstab | sed -n 5p ,前面为查看文件并显示行号,后面为只显示第五行内容,由于前面有空行,所以看到的是的行的编号;
输入命令 cat -b fstab | sed -n 6p ,只显示第六行内容;

在这里插入图片描述
输入命令 cat -b fstab | sed -n 6,8p ,前面为查看文件并显示行号,后面为显示第6行到第8行内容;
输入命令 cat -b fstab | sed -n ‘6;8p’ ,前面为查看文件并显示行号,后面为显示第6行和第8行内容;
输入命令 cat -b fstab | sed -ne ‘6,$p’ ,前面为查看文件并显示行号,后面为显示第6行到最后一行内容;
输入命令 cat -b fstab | sed -ne ‘2,6p’ ,前面为查看文件并显示行号,后面为显示第2行到第6行内容;

在这里插入图片描述

输入命令 sed -ne ‘/^#/p’ fstab ,显示以#开头的行内容;
输入命令 sed -ne ‘/^#/!p’ fstab ,显示不以#开头行内容;

在这里插入图片描述

  • d 删除
d删除
sed 5d westos删除第5行
sed ‘/^#/d’ fatab把# 开头的行删除
sed ‘/^UUID/!d’ fatab除了 UUID 之外的行都删除
sed -e ‘5,$d’ westos删除5到最后一行

输入命令 cat -b fstab | sed ‘5d’ ,前面为查看文件并显示行号,后面为删除第5行内容;

在这里插入图片描述
输入命令 sed ‘/^#/d’ fstab ,删除以#开头的行内容;
输入命令 sed ‘/^#/!d’ fstab ,删除除了以#开头以外的行内容;
输入命令 sed ‘/^UUID/!d’ fstab ,删除除了以UUID开头以外的行内容;

在这里插入图片描述
输入命令 cat -b fstab | sed -e ‘5,$d’ ,删除第5行以后的内容;
输入命令 cat -b fstab | sed -e ‘1,7d’ ,删除第1到第7行的内容;
在这里插入图片描述

  • a #添加
    sed -e '$ a hello world’ fstab
    sed -e ‘/^#/a hello world’ fstab

输入命令 sed ‘5a hellozxk’ zxk,表示在 zxk 文件的第5行添加 hellozxk 的字符,默认添加的位置为最后;
输入命令 sed ‘1a hellozxk’ zxk,表示在 zxk 文件的第1行添加 hellozxk 的字符;

在这里插入图片描述
输入命令 sed ‘$a hellozxk’ zxk,表示在 zxk 文件的最后一行添加 hellozxk 的字符;
输入命令 sed ‘/UUID/a hellozxk’ zxk,表示在 zxk 文件的UUID所在行添加 hellozxk 的字符;

在这里插入图片描述

  • c #替换
    sed -e ‘/^#/c hello world’ fstab
    sed ‘5c hello world’ westos

输入命令 sed -e ‘/^#/c hello zxk’ zxk,表示在 zxk 这个文件中以#开头的行都替换为 hello zxk;
输入命令 sed -e ‘5c hello zxk’ zxk,表示在 zxk 这个文件中的第5行替换为 hello zxk;

在这里插入图片描述

  • w 把符号的行写到指定文件中
    sed ‘/^UUID/w westosfile’ westos

输入命令 sed -n ‘/UUID/w westosfile’ zxk,表示将 zxk 文件中 UUID 所在行的信息写入 westosfile 文件中;

在这里插入图片描述

  • i #插入
    sed ‘5i hello westos’ westos

添加是位于行尾的添加,而插入则是在行首插入信息;
输入命令 sed ‘/UUID/i 123>>’ zxk,表示在 zxk 文件中的UUID 所在的行插入 123>> 信息;
在这里插入图片描述

  • r #整合文件
    sed ‘5r haha’ westos

如图所示,将 111 文件中的信息整合到 222 文件中的第2行。

在这里插入图片描述

  • sed字符替换
    sed ‘s/ : /###/g’ westos

输入命令 sed ‘s/😕###/g’ passwd,将 passwd 文件中全文的 : 换成###。

在这里插入图片描述

3. awk

  • 用法 awk -F 分隔符 BEGIN{}{}END{} FILENAME

  • 参数
    NR ##行数
    NF ##列数
    FILENAME ##文件名称本身
    westos ##westos变量值
    “westos” ##westos字符串

  • 条件
    /bash$/ ## 条件
    /条件1|条件2/ ##条件1或者条件2
    /条件1/||/条件2/ ##条件1或者条件2
    /条件1/&&/条件2/ ##条件1并且条件2

$0 ##所有的列
$1 ##第一列
$2 ##第二列
$3 ##第三列


在做之前先复制一个素材,如图所示:

在这里插入图片描述
输入命令 awk -F : ‘{print $1}’ passwd 表示在以 : 为分割符,在当前目录的 passwd 文件中显示第一列内容;
输入命令 awk -F : ‘{print $1$2}’ passwd 表示以 : 为分割符,在当前目录的 passwd 文件中显示第一列和第二列内容;

在这里插入图片描述
上面虽然可以显示第一列和第二列的内容,但是是连在一起的;可以输入命令 awk -F : ‘{print $1 “ ” $2}’ passwd 表示在以 : 为分割符,在当前目录的 passwd 文件中显示第一列和第二列内容,两列内容之间用空格分隔开;

在这里插入图片描述
输入命令 awk -F : ‘{print $0}’ passwd 表示在以 : 为分割符,在当前目录的 passwd 文件中显示所有列内容;

在这里插入图片描述
输入命令 awk -F : ‘BEGIN{print “userlist:”}{print $1}END{print “end”}’ passwd,表示以:为分割符,在显示第一列内容之前,先显示 userlist 字符串,再显示第一列内容,然后再显示 end 字符串;

在这里插入图片描述
输入命令 awk -F : ‘{print NR}’ passwd,以:为分割符,显示文件的行数;
输入命令 awk -F : ‘{print NF}’ passwd,以:为分割符,显示文件的列数;

在这里插入图片描述
输入命令 awk -F : ‘{print FILENAME}’ passwd,以 : 为分割符显示 passwd 文件的文件名;

在这里插入图片描述
输入命令 awk -F : ‘BEGIN{linux=2}{print linux}’ passwd,以:为分割符,显示变量值;
输入命令 awk -F : ‘BEGIN{linux=2}{print “linux”}’ passwd,以:为分割符,显示字符串;

在这里插入图片描述
输入命令 awk -F : ‘/bash$/{print $1}’ passwd,以:为分割符,显示以 bash 结尾的第一列内容;

输入命令 awk -F : ‘/^root/{print $1}’ passwd,以:为分割符,显示以 root 开头的第一列内容;

输入命令 awk -F : ‘/^root/&&/bash$/{print $1}’ passwd,以:为分割符,显示以 root 开头并且以 bash 结尾的第一列内容;

输入命令 awk -F : ‘/root/||/ bash$/{print $1}’ passwd,以:为分割符,显示有 root或者以 bash 结尾的第一列内容;

输入命令 awk -F : ‘/root|bash$/{print $1}’ passwd,显示有 root 或者以 bash 结尾的第一列内容;

在这里插入图片描述
输入命令 awk -F : ‘$7~//bin/bash/{print $1}’ passwd,显示以:为分割符,第7列以 /bin/bash 结尾的第一列内容;
输入命令 awk -F : ‘$7!~//bin/bash/{print $1}’ passwd,显示以:为分割符,第7列除了以 /bin/bash 结尾以外的第一列内容;

在这里插入图片描述
输入命令 awk -F : ‘/root/{print $1}’ passwd,显示含有 root 的第一列内容;
输入命令 awk -F : ‘!/root/{print $1}’ passwd,显示除了含有 root 以为行的第一列内容。

在这里插入图片描述

test:

  1. 统计在系统中能用 su 切换的并且用户家目录不在/home 下的用户数量

输入命令 awk -F : ‘BEGIN{N=0} /bash$ |sh$/&&$6!~/^/home/{N++}END{print N}’ /etc/passwd;表示以:为分割符,开始执行,N=0,中间查找以 bash 或者 sh 结尾并且第6列不以 /home 开头的行,并做 N++1 的动作,最后输出 N 的值即可。

在这里插入图片描述

  1. 用命令来显示当前主机的 ip

输入命令 ifconfig br0 | awk ‘/inet>/{print $2}’,显示网卡信息,用 awk 命令来显示以 inet 开头后面没有字符的行的第二个字符串。

在这里插入图片描述

  1. 用 awk 统计 passwd 的行数,抓取最后一行的最后一列。

输入命令 awk -F : ‘END{print NR}’ /etc/passwd,以:为分割符,在结尾执行的动作是只显示行数;
输入命令 awk -F : ‘END{print $NF}’ /etc/passwd,以:为分割符,在结尾执行的动作是只显示最后一行的最后一列。
awk 是默认向下统计的。
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值