Linux运维shell文本处理工具grep sed swk操作示例

一、grep

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

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

1、grep的格式

grep 匹配条件 处理文

   
-i 忽略大小写
-E “/<root” root字符之前不能有字符
-E ”root/>“ root字符之后不能有字符
-数字 显示过滤行以及上面几行和下面几行
-n 显示匹配的行所在行号
-A 显示过滤行以及下面几行
-B 显示过滤行以及上面几行
-v 反向过滤

建立实验素材:

 grep -E "bash$|nologin$" passwd  ##过滤以bash结尾或nologin结尾的行 grep -i root passwd  ##过滤含root关键字的行,不分大小写 grep -iE "/<root/>" passwd  ##过滤root关键字前后都没有字符的行,不分大小写

 grep -1 ROOT passwd  ##显示含root的行,以及上下各一行 grep -A 2 -B 1 -n ROOT passwd  ##显示含root的行,以及上1行,下2行,均显示行号 grep root passwd | grep -E "^root" -v  ##显示root在结尾或中间的行,即反向过滤root在开头

2、grep字符数量匹配规则

   
^root 以root开头
root$ 以root结尾
s…k s开头k结尾中间任意3个字符
….k k结尾前后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 's.{2,4}s' grepfile  ##s和s之间有2到4个任意字符 grep -E 's.?s' grepfile  ##s和s之间有0到1个任意字符 grep -E 's(ks){2,}' grepfile  ##s后面ks字符串最少出现2次

3、示例

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

 grep -E "/bin/bash$|/bin/sh$" /etc/passwd | cut -d : -f 1

二、sed

1、sed的格式

sed 参数 命令 处理对象

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

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’ 显示以#开头的行

d:删除

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

a:添加,c:替换

   
-e ‘$a hello world’ 最后一行后添加
-e ‘5a hello/nworld’ 第5行后添加换行的内容
-e ‘/^#/a hello world’ 在以#开头的行后面添加
   
-e ‘/^#/c hello world’ 替换以#开头的行
‘5chello world’ 替换第5行

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

   
‘/^root/w linuxfile’ 把文件中root开头的行写入linuxfile中
   
‘5ihello linux’ 第5行前插入内容
   
‘5r haha’ 把haha文件的内容整合到第5行之后

3、字符替换

建立实验素材:

 sed '=' passwd  ##每一行前面加行号 sed '=' passwd | sed 'N;s//n/ /g'  ##将换行符转换为空格(sed是逐行检测的,加入N提前加载处理下一行) sed 'G' passwd  ##每行后面都加一个空行 sed '$G' passwd  ##给最后一行后加空行 sed '$!G' passwd  ##除了最后一行在后面都加空行 sed 's/:/#/g' passwd  ##将全文的:替换为#,s全文,g每行的全部 sed 's/:/#/' passwd  ##只替换每行的第一个 sed '1s/:/%%%/g' passwd  ##第一行替换 sed '1,5s/:/%%%/g' passwd ##替换1到5行 sed '1s/:/%%%/g;5s/:/%%%/g' passwd  ##替换第1行和第5行 sed '/mail/,/ftp/s/:/%%%/g' passwd  ##指定字符间替换 sed 's////%%%/g' passwd  ##替换全文的"/","/"为转义字符 sed 's@/@%%%@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,在其他主机可以访问到测试页面

 vim Apache_port.sh #!/bin/bash yum install httpd -y &> /dev/null systemctl enable --now httpd &> /dev/null echo "hello linux" > /var/www/html/index.html systemctl enable --now firewalld &> /dev/null [ -z $1 ] && {         echo "ERROR: Pleaase input port number following script !!"         exit } [ -z "`netstat -antlupe | grep -E ":$1/>"`" ] || {          echo "Error: $1 is using !!!"         exit } sed "/^Listen/c Listen $1" -i /etc/httpd/conf/httpd.conf systemctl restart httpd firewall-cmd --permanent --add-service=http &> /dev/null firewall-cmd --reload &> /dev/null  echo "Change $1 sucessful!!"

三、awk

1、awk的格式

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

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

建立实验素材:

1、在passwd文件开始加上hello,结尾加上end,打印第一列

 awk -F : 'BEGIN{print "hello"}{print $1}END{print "end"}' passwd 

2、统计文件行数,显示以bash结尾的第一列

 awk -F : 'BEGIN{N=0}{N++}END{print N}' passwd0 awk -F : '/bash$/{print $1}' passwd 

3、第六列没有root关键字并且以bash结尾的行,显示第一列

 awk -F : '$6!~/root/&&/bash$/{print $1}' passwd 

2、示例

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

(1)方法一

 awk -F : '$6!~/^//home/&&/bash$/{print $1}' /etc/passwd | wc -l 

(2)方法二

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

以上就是Linux运维shell文本处理工具grep sed swk操作示例的详细内容,更多关于shell文本处理工具grep sed swk的资料请关注

商匡云商
Logo
注册新帐户
对比商品
  • 合计 (0)
对比
0
购物车