shell中的文本处理(grep sed awk)

************************grep*************************
1 .grep  文本过滤命令
Global search regular expression and print out the line
全面搜索研究正则表达式并显示出来
grep 命令是一种强大的文本搜索工具,根据用户指定的"模式"对目标文本进行匹配检查,打印匹配到的行

由正则表达式或者字符及基本文本字符所编写的过滤条件

2.grep的格式

grep ^root passwd            #root 开头的行
grep root$ passwd            #root 结尾的行
grep -i root passwd          #不区分大小写
grep -v root passwd          #反向过滤
grep -E "root|ROOT" passwd   #过滤含有root或者ROOT的行
grep -E "^root|ROOT" passwd  #过滤以root开头或者含有ROOT 的行

3.grep中的正则表达式

^root        #匹配以root开头的行
root$        #匹配以root结尾的行
'r...t'      #匹配r和t之间有3个字符的行(有几个点就代表匹配几个字符)
'r....'      #匹配r后有四个字符的行
'....t'      #匹配t之前有四个字符的行 

4.grep中字符的匹配位置设定

^关键字    #关键字开头
关键字$    #关键字结尾
\<关键字   #关键字开头不扩展
关键字\>   #关键字结尾不扩展
\<关键字\> #关键字开头结尾不扩展

5.grep中字符的匹配次数设定

*		字符出现[0-任意次]
\?		字符出现[0-1次]
\+		字符出现[1-任意次]
\{n\}		字符出现[n次]
\{m,n\}		字符出现[最少出现m次,最多出现n次]
\{0,n\}		字符出现[0-n次]
\{m,\}		字符出现[至少m次]
\(xy\)\{n\}     xy字符出现[n次]
.*		关键字之间匹配任意字符

************************sed*************************


1.sed 行编辑器
stream editor
用来操作纯 ASCII 码的文本
处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space)可以指定仅仅处理哪些行
sed 符合模式条件的处理不符合条件的不予处理,处理完成之后把缓冲区的内容送往屏幕,接着处理下一行,这样不断重复,直到文件末尾.

2.Sed 命令格式
调用sed 命令有两种格式
  sed [opinions参数] 'command'命令 file(s)
  sed [opinions]   -f scriptfile file(s)

3.sed对字符的处理
p   显示
d   删除
a   添加
c   替换
w   写入
i   插入
4.p模式操作
sed -n '/\:/p' fstab        #显示包含:的行
sed -n '/UUID$/p' fstab     #显示以UUID结尾的行
sed -n '/^UUID/p' fstab     #显示以UUID开头的行
sed -n '2,6p' fstab         #显示第2行到第6行
sed -n '2,6!p' fstab        #不显示第2到6
sed -n -e '2!p;6!p' | uniq -d  fstab   #不显示第二行和第六行


练习:
编写脚本,执行时其后跟usename password两个文件 则可以批量创建username文件中的用户,并设置其密码为password文件中的对应密码
vim user_create.sh
#!/bin/bash
MAX_LINE=`wc -l $1|cut -d " " -f 1`
for LINE_NUM in `seq 1 $MAX_LINE`
do
    USERNAME=`sed -n "${LINE_NUM}p" $1`
    PASSWORD=`sed -n "${LINE_NUM}p" $2`
    useradd $USERNAME
    echo $PASSWORD | passwd --stdin $USERNAME
done

5.d模式操作
sed '/^UUID/d' fstab        #删除UUID开头的行
sed '/^#/d' fstab           #删除#开头的行    
sed '/^$/d' fstab           #删除空行
sed '1,4d' fatab            #删除1到4行
sed '/^UUID/!d' fstab       #不删除UUID开头的行
sed '/^$/d;/^#/d' fstab     #删除空行以及以#开头的行


6.a模式操作
sed '/linux/ahello' westos         #在westos文件中给linux后添加hello
sed '/linux/ahello\nworld' westos  #在westos文件中给linux后添加hello 换行添加world
sed '/linux/a hello world' westos  #在westos文件中给linux后添加hello world

7.c模式操作
sed '/^UUID/c hello' fstab  #将以UUID开头的那一行替换成hello行

8.w模式操作
sed '/bash$/wfile' passwd         #把/etc/passwd中以bash结尾的行写入file中
sed -n '/bash$/wfile' /etc/passwd #同上,但不显示
sed '6r westos' fstab             #把westos里的内容写入fatab第六行中


9.i模式操作
sed '/^UUID/i hello' fstab  #在以UUID开头的那一行前插入hello行


10.sed的其他用法

sed 'G' fstab #每行之间添加一个空行显示
sed '$!G' fstab #除了最后一行每行之间添加一个空行显示
sed -n '$p' fstab #显示最后一行

练习:编写一个脚本,找到系统中可以登陆的用户
#!/bin/bash
SHELL=$(echo `grep -v nologin /etc/shells` | sed 's/ /|/g') 将nologin行反向过滤掉,并将结果输出为以行赋给SHEEL
grep -E "$SHELL" /etc/passwd | cut -d : -f 1   指定分隔符,显示第一列过滤用户

运行结果

************************awk*************************
1.awk报告生成器
awk处理机制:awk会逐行处理文本,支持在处理第一行之前做一些准备工作,以及在处理完最后一行做一些总结性质的工作,在命令格式上分别体现如下:
BEGIN{ } :读入第一行文本之前执行,一般用来初始化操作
{ }      :逐行处理,逐行读入文本执行相应的处理,是最常见的编辑指令块
END{ }   :处理完最后一行文本之后执行,一般用来输出处理结果
2.awk基本用法
awk  -F ":" '{print 'NR==3'}' passwd #以:为分隔符,打印第三列
awk -F ":" 'BEGIN {print NAME}{print $1}'  passwd #以:为分隔符,处理前打印NAME,打印第一列
awk  '/bash$/ ' passwd #以:为分隔符,打印以bash结尾的行
awk  -F ":" '/bash$/{print $1}'  passwd #以:为分隔符,打印以bash结尾的行的第一列
awk -F ":"  'BEGIN{N=0}/bash$/{N++}END{print N}' passwd #打印以bash结尾的行有多少行


练习:抓取eth0网卡的ip

ifconfig eth0 | awk -F " " '/inet\>/{print $2}'

统记在系统中可以登陆系统的用户

awk -F ":" 'BEGIN{N=0}//&&/bash$/{N++}END{print N}' /etc/passwd


猜你喜欢

转载自blog.csdn.net/qq_40303205/article/details/80752679