一、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
grep -i root passwd
grep -iE "\<root\>" passwd
grep -1 ROOT passwd
grep -A 2 -B 1 -n ROOT passwd
grep root passwd | grep -E "^root" -v
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
grep -E 's.?s' grepfile
grep -E 's(ks){2,}' grepfile
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' | 显示以#开头的行 |
sed -n 5p passwd
sed -n '1p;$p' passwd
sed -n /root/p passwd
sed -ne "3,5p" passwd
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 'G' passwd
sed '$G' passwd
sed '$!G' passwd
sed 's/:/#/g' passwd
sed 's/:/#/' passwd
sed '1s/:/%%%/g' passwd
sed '1,5s/:/%%%/g' passwd
sed '1s/:/%%%/g;5s/:/%%%/g' passwd
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
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}' passwd
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
|