1.grep 文本过滤命令
##全面搜索研究正则表达式并显示出来
grep 命令 (Global search regular expression and print out the line)是一种强大的文本搜索工具,根据用户指定的‘模式’对目标文本进行匹配检查,打印匹配到的行。由正则表达式或者字符及基本文本字符所编写的过滤条件
(1)grep 的格式:
grep + 匹配条件 + 处理文件
例如: grep root passwd #过滤passwd中含有root的行并显示出来
grep ^root passswd #过滤passwd中以root开头行并显示出来
grep root$ passwd #过滤passwd中以root结尾行并显示出来
grep -i root passwd #过滤passwd中含有root的行且忽略大小写并显示出来
grep -E "root|ROOT" passwd #过滤passwd中含有root或者ROOT的行并显示出来
实验:(在虚拟机中)
cp /etc/passwd /mnt
ls /mnt
vim /mnt/passwd #先删除一些内容,再添加一些新的内容,方便后面的实验观察现象
cat /mnt/passwd
cd /mnt
grep root passwd #找出passwd中含有root的行
grep ^root passwd #找出passwd中以root开头行
grep -i ^root passwd #找出passwd中以root开头的行并且忽略大小写
grep root$ passwd #找出passwd中以root结尾的行
grep -E "^root|root$" passwd #过滤以root开头或以root结尾的行
egrep "^root|root$" passwd #说明 egrep 等同于 grep -E
@@显示passwd里root在中间的行
grep -i root passwd | grep -i -v -E "^root|root$" #-i表示忽略大小写
(2)grep 中正则表达式:
## . 代表一个任意字符
'r..t' #在r和t之间有2个任意字符
'r....' #在r的后面有4个任意字符
'..t' #在t的前面有2个任意字符
(3)grep中字符的匹配位置设定:
## ^ 表示以……开头 $ 表示以……结尾 \< \> 表示不做任何拓展
^root #以关键字root开头
root$ #以关键字root结尾
\<root #关键字root之前不做拓展 (精确匹配)
root\> #关键字root之后不做拓展
\<root\> #关键字root前后不做拓展
实验:
vim test
cat test
grep 'r.t' test
grep 'rt' test
grep 'r..t' test
grep '\<r..t' test
grep '\<r..t\>' test
(4)grep中字符的匹配次数设定:
* #字符出现0-任意次
\? #字符出现0-1次 ## \可以不写
\+ #字符出现1-任意次
\{n\} #字符出现n次
\{m,n\} #字符出现最少m次,最多n次
\{0,n\} #字符出现0-n次
\{m,\} #字符出现至少m次
\(xy\)\{n\}xy #关键字出现n次
.* #关键字之间匹配任意字符
例如:
grep -E 'r{0,}t' test #必须加-E
grep -E 'r.*t'
实验:
cat test
grep 'r*t' test #过滤r出现的任意次数
grep 'r\**t' test #过滤r,t之间有0个字符
grep 'ro*t' test #过滤r和t之间o出现的任意次数
grep -E 'ro*t' test #过滤r和t之间o出现的任意次数
grep -E 'ro?t' test #过滤r和t之间o出现的0和1次
grep -E 'ro{1,}t' test #过滤r和t之间o出现的1以上的次数
grep -E 'ro{,3}t' test #过滤r和t之间o出现的3以下的次数
@@只显示ip的这一行
(1)ifconfig eth0 | grep -E "inet\>"
(2)ifconfig eth0 | grep -E "inet "
@@用脚本显示能登陆的用户
cat /etc/shells
grep -v nologin /etc/shells #过滤掉系统不能的登陆的用户
echo `grep -v nologin /etc/shells` #将系统中可登陆的用户输出到一行
echo `grep -v nologin /etc/shells` | sed 's/ /|/g'
echo `grep -v nologin /etc/shells` | sed 's/ /##/g'
vim show_loginuser.sh
############
注释 sed 's/ /|/g' #将全文的 空格 替换为 |
chmod +x show_loginuser.sh
/mnt/show_loginuser.sh
vim show_loginuser.sh
###########
sh show_loginuser.sh
useradd -s /bin/tcsh haha
su - haha
logout
sh show_loginuser.sh
useradd -s /bin/csh hai
su - hai
ps
logout
/mnt/show_loginuser.sh
2. sed 行编辑器
sed对字符的处理:
p 显示 d 删除 a 添加
c 替换 w 写入 i 插入
(1) p 模式操作(显示)
sed -n '^:/p' fstab #显示fstab中以:开头的行
sed -n 'UUID$/p' fstab #显示fstab中以UUID结尾的行
sed -n '/^UUID/p' fstab #显示fstab中以UUID开头的行
sed -n '2,6p' fstab #显示fstab中的第二到第六行
sed -n '2,6!p' fstab #显示fstab中除过第二到第六行其余的行
实验:
rm -rf *
cp /etc/fstab /mnt
ls
cat fstab
sed -n '/^#/p' fstab #显示fstab中以#开头的行
sed -n '/^#/!p' fstab #显示fstab中不以#开头的行
cat -n fstab # -n 添加行号
cat -n fstab | sed -n '2,6p' #显示第2到第6行
cat -n fstab | sed -n '2p' #显示第2行
cat -n fstab | sed -n -e '2p'
cat -n fstab | sed -n '6p' #显示第6行
cat -n fstab | sed -n -e '6p'
cat -n fstab | sed -n -e '6p' -e '2p' #显示第2行和第6行
cat -n fstab | sed -n -e '2p;6p'
cat -n fstab | sed -n '2p;6p'
cat -n fstab | sed -ne '2!p;61!p' | uniq -d #不显示第2行和第6行
@@用脚本实现自动创建指定用户和密码
vim userfile
############
vim passfile
#############
vim user_create.sh
################
sh user_create.sh userfile passfile
id user1
su - user1
su - user2
(2) d 模式操作:(删除,不删除原文件)
sed '/^UUID/d' fstab #删除以UUID开头的行
sed '/^#/d' fstab #删除以#开头的行
sed '/^$/d' fstab #删除以空格开头的行
sed '/^UUID/!d' fstab #删除不是以UUID开头的行
cat -n fstab | sed '1,4d' #删除1到4行
cat -n fstab | sed -e '2d;6d' #删除第二行和第六行
实验:
cat fstab
sed '/^#/d' fstab
sed '/0$/d' fstab
cat -n fstab | sed '1,4d'
cat -n fstab | sed -e '2d;6d'
(3) a 模式操作:(添加,默认添在最后边)
sed '/^UUID/a\hello' fstab #在以UUID开头的行的前一行添加hello
sed '/^UUID/a\hello \nwestos' fstab #在以UUID开头的行的前一行添加hello换行再添加westos
实验:
vim westos
######
westos
sed '/hello/aworld' westos #在westos中的hello后添加world
sed '/hello/aworld\nhappy' westos # \n 表示换行
sed '/westos/a\world' westos
sed 's/westos/hello world/g' westos
(4) i 模式:(插入,可插到任意位置)
sed '/^UUID/i\hello' fstab #在UUID的前一行添加hello
例如:
sed '/^hello/i\world' westos
(5) c 模式:(替换)
sed '/^UUID/c\hello' fstab #把以UUID开头的行替换成hello
实验:
sed '/hello/chello world' westos
sed '/hello/chello\nworld' westos
(6) w 模式操作:(写入)
sed '/^UUID/w\westos' fstab
sed -n '/^UUID/w\westos' fstab
sed '/^UUID/=' fsatb #显示fsatb文件中以UUID开头所在的行号
sed '6r westos' fstab
实验:
sed -n '/bash$/p' passwd > file #把passwd中以bash结尾的行输入到file中(先处理前面的,之后再执行)
cat file
sed -n '/bash$/wfile1' passwd #把passwd中以bash结尾的行输入到file1中(边处理边执行)
cat file1
sed '/hello/=;wfile' westos #把westos中的hello写入到file中,并显示行号
(7)sed的其他用法:
sed -n '/^UUID/=' fstab #显示fstab中以UUID开头的行号
sed -n -e '/^UUID/p' -e '/^UUID/=' fstab #显示fstab中以UUID开头的这一行内容并且输出它的行号(只显示符合条件的) -e 用来连接两个条件
sed -e '/^UUID/p' -e '/^UUID/=' fstab #(显示全文)
sed 'G' data #每行加空行显示data中内容
sed '$!G' data #每行加空行但最后一行不加空行显示
sed '=' data | sed 'N;s^n//' #N表示每行多加一个换行符
sed -n '$p' data #显示文件的最后一行
sed -f rulesfile file #按照rulesfile的要求显示file但不更改原文件
sed 's/^\//#/' fstab #将全文的开头的/替换为#
实验:
cat /etc/shells
sed -n '/bash$/=' /etc/shells
sed -n -e '/^\/usr/=' -e '/^\/usr/p' /etc/shells
sed 'G' /etc/passwd
vim file1
cat file1
sed 'G' file1
sed '$!G' file1
sed -e '/^\/usr/=' -e '/^\/usr/p' /etc/shells
vim file1
cat file1
sed 's/westos/passwd/g' file1
sed '1,3s/westos/passwd/g' file1
cat file1
sed -e '/haha/,/root/s/westos/passwd/g;s/hello/lee/g' file1
vim file2
#################
sed 's/westos/passwd/g' file1
sed -f file2 file1 #不更改原文件
cat file1
sed -f file2 -i file1 #-i表示更改原文件
cat file1
@@安装apache并自行设定端口号
vim install_apache.sh
####################
sh install_apache.sh 8080 #将apache端口号改为8080
netstat -antlupe | grep 8080 #查看看8080端口
sh install_apache.sh 80 #将apache端口号改回80
netstat -antlupe | grep 80
3. awk 报告生成器
awk处理机制:awk会逐行处理文本,支持在处理第一行之前做一些准备工作,以及在处理完最后一行做一些总结性质的工作,在命令格式上分别体现如下:
BEGIN{} #读入第一行文本之前执行,一般用来初始化操作
{} #逐行处理,逐行读入文本执行相应的处理,是最常见的编辑指令块
END{} #处理完最后一行文本之后执行,一般用来输出处理结果
实验:
vim passwd
cat passwd
awk -F ":" '{print $1}' passwd #-F 指定分隔符,以:为分隔符,输出第一列
awk -F ":" 'BEGIN{print "NAME"}{print $1}' passwd #BEGIN 表示命令执行之前做的操作
awk -F ":" 'BEGIN{print "NAME"}{print $1}END{print "END"}' passwd #END 表示命令执行之后做的操作
awk -F ":" 'BEGIN{print "NAME"}{print NR;print}END{print "END"}' passwd
#NR 表示添加行号
awk -F ":" '{print NR,$0}' passwd #添加行号 且不换行
awk '/bash$/{print}' passwd #显示以bash结尾的所有行
awk -F ":" '/bash$/{print $1}' passwd #显示以bash结尾的第一列
awk '/^ro/{print}' passwd #以ro开头
awk '/^[a-d]/{print}' passwd #以a到d中任意字符开头
awk '/^[^a-d]/{print}' passwd #不以a-d开头
awk '/^a|linux$/{print}' passwd ##以a开头 或者 以linux结尾
awk '/^a/||/linux$/{print}' passwd
awk '/^a/&&/linux$/{print}' passwd #以a开头 并且 以linux结尾
@@显示可以登陆系统的用户的个数
awk -F ":" 'BEGIN{n=0}/bash$/{n++}END{print n}' /etc/passwd
@@统计文件的行数
awk 'BEGIN{n=0}{n++}END{print n}' /etc/passwd
@@显示系统可以登陆但家目录不在/home下的用户名称/个数
awk -F ":" '$6!~/^\/home/&&/bash$/{print $1}' /etc/passwd
awk -F ":" 'BEGIN{n=0}$6!~/^\/home/&&/bash$/{n++}END{print n}' /etc/passwd
useradd -d /mnt/home/ westos
awk -F ":" '$6!~/^\/home/&&/bash$/{print $1}' /etc/passwd
awk -F ":" 'BEGIN{n=0}$6!~/^\/home/&&/bash$/{n++}END{print n}' /etc/passwd
@@只显示eth0的ip
ifconfig eth0 | awk '/inet/{print}' #显示含有inet的一行
ifconfig eth0 | awk '/inet\>/{print}' #\> 表示向后做任何拓展
ifconfig eth0 | awk '/inet\>/{print $2}' #$2表示第二列 \>表示不做拓展