1. grep
全称:Globally search a Regular Experssion and Print
grep -E = egrep 是等同的效果
grep 格式
- 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” passwd | root 字符之前不能有字符 |
-E “root>" passwd | root 字符之后不能有字符 |
输入命令
输入命令查看 kkkfile 文件的内容,该文件中包含大小写;
输入命令 grep zxk kkkfile,过滤出 zxk 关键字;
输入命令 grep -i zxk kkkfile,忽略大小写来过滤 zxk 关键字;
输入命令 grep -i zxk kkkfile -v,忽略大小写来反向过滤;
- grep 字符数量匹配规则
字符 | 含义 |
---|---|
^westos | 以 westos 开头 |
westos$ | 以 westos 结尾 |
w…s | 以 w 开头 s 结尾,中间有四个字符 |
…s | s 结尾前面有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 处理规则文件
- 对字符的处理
- 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’ westos | 5到最后一行 |
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:
- 统计在系统中能用 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 的值即可。
- 用命令来显示当前主机的 ip
输入命令 ifconfig br0 | awk ‘/inet>/{print $2}’,显示网卡信息,用 awk 命令来显示以 inet 开头后面没有字符的行的第二个字符串。
- 用 awk 统计 passwd 的行数,抓取最后一行的最后一列。
输入命令 awk -F : ‘END{print NR}’ /etc/passwd,以:为分割符,在结尾执行的动作是只显示行数;
输入命令 awk -F : ‘END{print $NF}’ /etc/passwd,以:为分割符,在结尾执行的动作是只显示最后一行的最后一列。
awk 是默认向下统计的。