Linux-shell中的文本处理工具

目录

一、grep

1、grep的格式 

2、grep字符数量匹配规则 

3、示例

二、sed

1、sed的格式

2、对字符的处理 

3、字符替换

4、示例 

三、awk

1、awk的格式 

 2、示例


一、grep

文本搜索工具,可以使用正则表达式搜索文本,把匹配的行打印出来

  • grep支持正则表达式
  • egrep支持扩展的正则表达式
  • grep -Eegrep

1、grep的格式 

grep 匹配条件 处理文件

-i忽略大小写
-E “\<root"root字符之前不能有字符
-E ”root\>“root字符之后不能有字符
-数字显示过滤行以及上面几行和下面几行
-n显示匹配的行所在行号
-A显示过滤行以及下面几行
-B显示过滤行以及上面几行
-v反向过滤
grep bash passwd 
cat passwd 
egrep "bash|haha" passwd 
grep -E "bash|haha" passwd 
grep -i bash passwd 
grep -E "bash\>" passwd 
grep -E "\<bash\>" passwd 
grep -E "\<bash" passwd 
cat -b passwd | grep -n haha
cat -b passwd | grep -n5 haha
cat -b passwd | grep -nA5 haha
cat -b passwd | grep -nB5 haha
cat -b passwd | grep -nv haha
cat -b passwd | grep -n2 haha
cat -b passwd | grep -2 haha

 

 

2、grep字符数量匹配规则 

^root以root开头
root$以root结尾
s...ks开头k结尾中间任意3个字符
....kk结尾前后4个任意字符
*字符出现任意
?0到1次
+1到任意次
{n}n次
{m,n}m到n次
{0,n}0-n次
{,n}0-n次
{m,}最少m次
(skk){6}skk字符串出现6次
grep -E 'w.s' yyl
grep -E 'w.*s' yyl
grep -E 'w.?s' yyl
grep -E 'w.+s' yyl
grep -E 'w.{3}s' yyl
grep -E '...s' yyl
grep -E 'w.{,3}s' yyl
grep -E 'w.{1,3}s' yyl
grep -E 'w.{3,}s' yyl
grep -E 'w(ea){3,}s' yyl

 

3、示例

请显示系统中能被su命令切换的用户名称
能被su切换,则必须以/bin/bash/bin/sh结尾

脚本:

shell=$(cat /etc/shells | xargs echo -n | tr ' ' '|')
grep -E "$shell" /etc/passwd | cut -d : -f 1

 

二、sed

1、sed的格式

sed 参数 命令 处理对象

-e:当给出多个sed指令时使用
-f:后面跟保存了sed指令的文件
-i:直接对内容修改,不加-i时默认为预览,不对文件做实际修改
-n:取消静默输出,sed默认会输出所有文本内容,使用-n后只显示处理过的行 

sed '=' passwd
sed -e '=;N' passwd
sed -e '=;G' passwd 
sed -e '=' passwd | sed -e 'N;s/\n/ /g' 

 

 

 

 

2、对字符的处理 

p:显示

-n 5p显示第5行
-n 3,5p显示3到5行
-n ”3p;5p“显示3和5行
-ne 1,5p显示1-5行
-ne '5,$p'显示5到最后行
-n '/^#/p'显示以#开头的行

sed -n 5p passwd 
sed -n '1,5p' passwd 
sed -n '1p;5p' passwd 
sed -n '1p;$p' passwd 
sed -n '/^#/p' fstab 
sed -ne '/^#/!p;/^$/p' fstab 
sed -ne '/^#/!p' fstab | sed -ne '/^$/!p'

d:删除

5d删除第五行
'/^#/d'把#开头的行删除
'/^UUID/!d'除了UUID开头以外的行都删除
-e '5,$d'删除5到最后一行
sed '5d' fstab 
sed '/^#/d' fstab 
sed -e '/^#/d;/^$/d' fstab
sed -e '/^UUID/!d' fstab 

 ​​​​​

 a:添加,c:替换

-e '$a hello world'最后一行后添加
-e '5a hello\nworld'第5行后添加换行的内容
-e '/^#/a hello world'在以#开头的行后面添加
-e '/^#/c hello world'替换以#开头的行
'5chello world'替换第5行
sed '5ahello' fstab 
sed '1,5ahello' fstab 
sed '/^#/ahello' fstab
sed '/#/chello' fstab 

 

 

w:把符合的行写到指定文件中,i:插入,r:整合文件

'/^root/w linuxfile'把文件中root开头的行写入linuxfile
'5ihello linux'第5行前插入内容
'5r haha'haha文件的内容整合到第5行之后
sed '/#/wfile' fstab
cat file 
sed '5ahello' yyl
sed '5ihello' yyl
cat test1 test2
sed '1rtest2' test1

 

 

 3、字符替换

sed 's/:/@/g' passwd     ##将全文的:替换为@,s全文,g每行的全部
sed '1,5s/:/@/g' passwd 
sed -e '1s/:/@/g;5s/:/@/g' passwd 
sed -e '/adm/,/gdm/s/:/@/g' passwd 
sed -e '/adm/,/gdm/s/:/@/g' -i passwd
cat passwd 
vim rule 
sed -f rule passwd 

 

 

 

 

vim rule:

 s/sbin/yyl/g;s/nologin/westos/g
11d
1s/:/@/g;5s/:/@/g

4、示例 

编写Apache_port.sh,此脚本后接数字,http的端口就改为此数字,假设selinux为关闭状态
例如:
sh Apache_port.sh
ERROR: Pleaase input port number following script !!
sh Apache_port.sh 8080
apache的端口会被修改为8080

 脚本:

[ -z "$*" ] &>/dev/null &&{
        echo ERROR: Pleaase input port not null following script !!
        exit
}

echo "$*" | grep -E '^[0-9]*$' &> /dev/null ||{
        echo ERROR: Pleaase input port number following script !!
        exit
}

rpm -q httpd &> /dev/null ||{
        echo No httpd installed
        exit
}

netstat -antlupe | grep -E ":$*\>" &> /dev/null &&{
        echo port is used
        exit
}

sed "/^Listen/cListen $* " -i /etc/httpd/conf/httpd.conf
systemctl restart httpd
netstat -antlupe | grep httpd

 

三、awk

1、awk的格式 

awk -F 分隔符 BEGIN{}{}END{} FILENAME 

NR行数
NF列数
FILENAME文件名称本身
linuxlinux变量值
“linux”linux字符串
/bash$/条件
/条件1|条件2/条件1或者条件2
/条件1/||/条件2/条件1或者条件2
/条件1/&&/条件2/条件1并且条件2
$0所有的列
$1第1列
$2第2列
$3第3列

ifconfig ens160 | awk '/inet\>/{ print $2 }'
ifconfig ens160 | awk '/inet\>/{ print $NF }'
ifconfig ens160 | awk '/inet\>/{ print $NR }'
ifconfig ens160 | awk 'BEGIN{N=0}/inet\>/{print $NF;N++}END{print N}'

awk '{print $1}' fstab 
awk '{print $0}' fstab 
awk '/^#/{print $0}' fstab
vim fstab 
awk '/^#/&&/UUID/{print $0}' fstab
awk 'NR==6{ print $0 }' fstab 
awk 'NR==6{ print FILENAME }' fstab 
awk 'NR==6{ print "FILENAME" }' fstab

 

 

 

 

awk -F : '/nologin$/{ print $1}' passwd 
awk -F : 'BEGIN{N=0}/nologin$/{N++}END{ print N }' passwd
awk -F : '/home/{print $0}' passwd 
awk -F : '$6~/home/{print $0}' passwd 
awk -F : '$6!~/home/{print $0}' passwd 
awk -F : '$6!~/home/&&!/nologin/{print $0}' passwd 

 

 

 

 2、示例

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

脚本:

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值