文章目录
1.grep(搜索工具)
grep (缩写来自Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用特定模式匹配(包括正则表达式)搜索文本,并默认输出匹配行。
egrep和fgrep都是grep的扩展,grep grep -E = egrep
注意:在某些机器上,要使用 -E参数才能够进行 逻辑匹配
下列规则也应用于 egrep 命令:
- 一个正则表达式后面带一个 + (加号)会匹配一个或多个的正则表达式。
- 一个正则表达式后面带一个 ? (问号)会匹配零个或一个该正则表达式。
- 由 | (竖线)或者换行符隔开的多个正则表达式会匹配与任何一个正则表达式所匹配的字符串。
- 一个正则表达式可以被包括在“()”(括弧)中进行分组。
换行符将不会被正则表达式匹配。
运算符的优先顺序是 [, ], *, ?, +, 合并, | 和换行符
1.1 grep的格式
grep | 匹配条件 | 需要处理的文件 |
---|
grep root passwd | 过滤root关键字 |
---|---|
grep ^root passwd | 以root开头 |
| grep root$ passwd | 以root结尾
| grep -i root passwd | 忽略大小写
| grep -E “<root” passwd | root字符之前不能有字符
| grep -E “root>” passwd | root字符之后不能有字符
| grep -数字 | 显示过滤行以及上面几行和下面几行
| grep -n | 显示匹配的行所在行号
| grep -A | 显示过滤行以及下面几行
| grep -B | 显示过滤行以及上面几行
| grep -v | 反向过滤
1.2 grep字符数量匹配规则
符数量匹配规则 | |
---|---|
^westos | 以westos开头 |
westos$ | 以westos结尾 |
w…s | w开头s结尾中间4个任意字符 |
…s | s结尾前面5个任意字符 |
(-E) * | 字符出现0到任意次 |
(-E)? | 字符出现0到1此 |
(-E)+ | 字符出现1到任意次 |
(-E){n} | 字符出现n次 |
(-E){m,n} | 字符出现m到n次 |
(-E){0,n} | 字符出现0-n次 |
(-E){,n} | 字符出现0-n次 |
(-E){m,} | 字符出现最少m次 |
(-E)(lee){2} | lee字符串出现2次 |
1.3 grep的练习脚本
请显示系统中能被su命令切换的用户名称
方法一:(有漏洞)
#!/bin/bash
grep "/bin/bash" /etc/passwd | cut -d : -f 1
方法二:
#!/bin/bash
grep -E "bash$|sh$|tcsh$|csh$" /etc/passwd |cut -d : -f 1
2.sed
2.1 sed命令格式
sed全称是:Stream EDitor
sed 命令是将需要处理的内容放入模式空间,对模式空间的内容进行逐行处理。
注意:在使用sed命令使常用-n 参数不显示模式空间。
sed 参数 命令 处理对象 |
---|
sed 参数 处理对象 -f 处理规则文件 |
2.2 sed命令对字符的处理
1.p——显示
sed -n 5p westos | 显示第五行 |
---|---|
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’ fstab | 显示以#开头的行 |
2. d——删除
sed 5d westos | 删除第五行 |
---|---|
sed -e ‘5,$d’ westos | 删除5行以后 |
sed ‘/ ^ #/d’ fstab | 把#开头的行删除 |
sed ‘/^UUID/!d’ fstab | 除了UUID以外的行都删除 |
3.a——添加
sed -e ‘$a hello world’ fstab | 在最后一行添加hello world |
---|---|
sed -e ‘$a hello\nworld’ fstab | 在最后一行添加hello 换行添加world |
sed -e ‘/^#/a hello world’ fstab |
4.c——替换
sed -e ‘/^#/c hello world’ fstab | 以#开头的行替换为hello world |
---|---|
sed ‘5chello world’ westos | 替换第5行为 hello world |
5.w ##把符合的行写到指定文件中
sed ‘/^UUID/w newfile’ fstab | 把fstab中UUID开头的行写入newfile中 |
---|
6.i——插入
sed ‘5ihello hello’ westos | 在第五行上面插入 |
---|---|
sed ‘5ahello hello’ westos | 在第五行下面插入 |
7.r——整合文件
sed '5r haha' westos
2.3 sed 字符替换
sed ‘s/ : /#/g’ westos | 全文的 :替换为# |
---|---|
sed ‘1s/ : /#/g’ westos | 全文第一行的:替换成# |
sed ‘s/ : /#/’ westos | 全文第一列的:替换为# |
sed ‘1,5s/ : /#/g’ westos | 全文前5行的:替换为# |
sed ‘1s/ : /#/g;5s/ : /#g’ westos | 全文第1行和第5行的:替换成# |
sed ‘/lp/,/shutdown/s/ : /#/g’ westos | 全文字符lp到字符shutdown行列的:替换成# |
sed ‘s/ \ //####/g’ westos | 全文的 \替换为# |
sed ‘s@/@####@g’ westos | 全文的 \替换为# |
2.4 把sed处理的内容保存到文件中
sed 's@/@####@g' -i passwd
2.5 sed练习及脚本
Apache_port.sh 此脚本后介入数字 http的端口就改为此数字 假设selinux为关闭状态
方法一:(有漏洞,行数查看不准确)
#!/bin/bash
[ -z "$1" ] && {
echo "Error:no port.please input the port number for Apache!"
exit
}
sed "45cListen $1" -i /etc/httpd/conf/httpd.conf
firewall-cmd --permanent --add-port=$1/tcp &>/dev/null
firewall-cmd --reload &>/dev/null
systemctl restart httpd
echo Now the Apache port number has changed to $1 .
方法二:
!/bin/bash
[ -z "$1" ] && {
echo "Error:no port.please input the port number for Apache!"
exit
}
[ -z "`netstat -antlupe | grep :$1`" ] || {
echo "Error:$1 is used by system proto!"
exit
}
[ -e "/etc/httpd/conf/httpd.conf" ] || {
yum install httpd.x86_64 -y &>/dev/null || {
echo "Error:apache not installed and yum repo is not available"
exit
}
}
sed "/^Listen/c Listen $1" -i /etc/httpd/conf/httpd.conf
firewall-cmd --permanent --add-port=$1/tcp &>/dev/null
firewall-cmd --reload &>/dev/null
systemctl restart httpd &>/dev/null && {
echo Now the Apache port number has changed to $1 .
} || {
echo "Error: can't up httpd service!See "journalctl -xe" for details."
}
3.awk
AWK是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。
只要在输入数据中有模式匹配,就执行一系列指令。该实用工具扫描文件中的每一行,查找与命令行中所给定内容相匹配的模式。如果发现匹配内容,则进行下一个编程步骤。如果找不到匹配内容,则继续处理下一行。
awk也支持用逻辑运算符:!(非)、&&;(与)、||(或)和括号()进行多重判断。
3.1 awk格式
awk -F 分隔符 BEGIN{ }{ }END{ } FILENAME |
---|
注意:不加-F的时候默认分隔符为空格
3.2 awk的内置变量
NR | 已经读出的记录数(行数) |
---|---|
NF | 当前记录中的字段个数(列数) |
FILENAME | 当前正在处理的文件名,该变量不能在BEGIN块中使用。 |
{print hello} | hello变量值 |
{print “hello”} | hello字符串 |
$0 所有的列 | $1第一列 ($2 #第二列 ;$3 第三列…) |
3.2 awk的运算
awk支持多种运算,这些运算与C语言提供的基本相同:如+、-、*、/、%等等,同时,awk也支持C语言中类似++、–、+=、-=、=+、=-之类的功能。
/bash$/ | 条件 |
---|---|
/条件1 | 条件2/ |
/条件1/II/条件2/ | 条件1或者条件2 |
/条件1/&&/条件2/ | 条件1并且条件2 |
3.3 awk的练习
统计在系统中能su切换的并且用户加目录不在/home下的用户数量
在rhel8中
#!/bin/bash
awk -F : '$6!~/home/&&/bash$|sh$/{print}' /etc/passwd | wc -l
在rhel7中
#!/bin/bash
awk -F : 'BEGIN{N=0}$6!~/home/&&/bash$|sh$|tsh$|csh$/{print $1;N++}END{print N}' /etc/passwd