目录
一、grep
文本搜索工具,可以使用正则表达式搜索文本,把匹配的行打印出来
- grep支持正则表达式
- egrep支持扩展的正则表达式
grep -E
=egrep
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...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 '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 | 文件名称本身 |
linux | linux变量值 |
“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