1、grep
1.1 什么是grep和egrep
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来(匹配到的标红)。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。
grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。
1.2 命令参数
常用参数已加粗
-
-A<显示行数>:除了显示符合范本样式的那一列之外,并显示该行之后的内容。
-
-B<显示行数>:除了显示符合样式的那一行之外,并显示该行之前的内容。
-
-C<显示行数>:除了显示符合样式的那一行之外,并显示该行之前后的内容。
-
-c:统计匹配的行数
-
-e :实现多个选项间的逻辑or 关系
-
-E:扩展的正则表达式
-
-f FILE:从FILE获取PATTERN匹配
-
-F :相当于fgrep
-
-i --ignore-case #忽略字符大小写的差别。
-
-n:显示匹配的行号
-
-o:仅显示匹配到的字符串
-
-q: 静默模式,不输出任何信息
-
-s:不显示错误信息。
-
-v:显示不被pattern 匹配到的行,相当于[^] 反向匹配
-
-w :匹配 整个单词
1.3演练:
[root@CBDD test]# cat nano
AAAAAA
BBBBBB
CCCCCC
DDDDDD
aaaaaa
bbbbbb
cccccc
[root@CBDD test]# grep -A2 B nano
BBBBBB
CCCCCC
DDDDDD
[root@CBDD test]# grep -B2 B nano
AAAAAA
BBBBBB
[root@CBDD test]# grep -C1 B nano
AAAAAA
BBBBBB
CCCCCC
[root@CBDD test]# grep -c B nano
1
[root@CBDD test]# grep -c A nano
1
[root@CBDD test]# grep -e AAA -e bbb nano
AAAAAA
bbbbbb
[root@CBDD test]# grep -in a nano
1:AAAAAA
5:aaaaaa
[root@CBDD test]# grep -o AA nano
AA
AA
AA
[root@CBDD test]# grep -v c nano
AAAAAA
BBBBBB
CCCCCC
DDDDDD
aaaaaa
bbbbbb
[root@CBDD test]# grep -w a nano
[root@CBDD test]# grep -w AAAAAA nano
AAAAAA
[root@CBDD test]#
3、认识sed
sed 是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(patternspace ),接着用sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。如果没有使诸如‘D’ 的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出或-i。
功能:主要用来自动编辑一个或多个文件, 简化对文件的反复操作
2.1、常用选项options
-
-n:不输出模式空间内容到屏幕,即不自动打印,只打印匹配到的行
-
-e:多点编辑,对每行处理时,可以有多个Script
-
-f:把Script写到文件当中,在执行sed时-f 指定文件路径,如果是多个Script,换行写
-
-r:支持扩展的正则表达式
-
-i:直接将处理的结果写入文件
-
-i.bak:在将处理的结果写入文件之前备份一份
2.2、编辑命令command
-
d:删除模式空间匹配的行,并立即启用下一轮循环
-
p:打印当前模式空间内容,追加到默认输出之后
-
a:在指定行后面追加文本,支持使用\n实现多行追加
-
i:在行前面插入文本,支持使用\n实现多行追加
-
c:替换行为单行或多行文本,支持使用\n实现多行追加
-
w:保存模式匹配的行至指定文件
-
r:读取指定文件的文本至模式空间中匹配到的行后
-
=:为模式空间中的行打印行号
-
!:模式空间中匹配行取反处理
-
在替换时,可以加一下命令,实现大小写转换
-
\l:把下个字符转换成小写。
-
\L:把replacement字母转换成小写,直到\U或\E出现。
-
\u:把下个字符转换成大写。
-
\U:把replacement字母转换成大写,直到\L或\E出现。
-
\E:停止以\L或\U开始的大小写转换
2.2、sed用法演示
[root@CBDD test]# sed "/AAA/p" nano
AAAAAA //打印匹配到的和没匹配到的
AAAAAA
BBBBBB
CCCCCC
DDDDDD
aaaaaa
bbbbbb
cccccc
[root@CBDD test]# sed -n "/aaa/p" nano // 只打印匹配到的
aaaaaa
[root@CBDD test]# sed -e "s/a/A/" -e "s/b/B/" nano
AAAAAA
BBBBBB
CCCCCC
DDDDDD // 实现多点编辑,将第一个匹配到的a和b 替换成A B
Aaaaaa
Bbbbbb
cccccc
[root@CBDD test]# cat nano
AAAAAA
BBBBBB
CCCCCC
DDDDDD
aaaaaa
bbbbbb
cccccc
[root@CBDD test]# sed -e "s/a/A/g" -e "s/b/B/g" nano
AAAAAA
BBBBBB
CCCCCC
DDDDDD
AAAAAA
BBBBBB
cccccc
[root@CBDD test]# sed -i.bak "s/a/A/g" nano
[root@CBDD test]# cat nano
AAAAAA
BBBBBB
CCCCCC //-i 执行 .bak 生成bak备份文件
DDDDDD
AAAAAA
bbbbbb
cccccc
[root@CBDD test]# cat nano.bak
AAAAAA
BBBBBB
CCCCCC
DDDDDD
aaaaaa
bbbbbb
cccccc
2.3、编辑命令command演示
[root@CBDD test]# sed "2d" nano
AAAAAA // 删除第二行
CCCCCC
DDDDDD
AAAAAA
bbbbbb
cccccc
[root@CBDD test]# sed -n "2p" nano // 只打印第二行
BBBBBB
[root@CBDD test]# sed "2a666" nano // 在第二行后面追加666
AAAAAA
BBBBBB
666
CCCCCC
DDDDDD
AAAAAA
bbbbbb
cccccc
[root@CBDD test]# sed "2i666" nano // 在第二行前边插入666
AAAAAA
666
BBBBBB
CCCCCC
DDDDDD
AAAAAA
bbbbbb
cccccc
[root@CBDD test]# sed -n "=" nano
1 // 显示行号
2
3
4
5
6
7
8
[root@CBDD test]# sed 's@[a-z]@\u&@g' nano // 将所有小写字母替换成大写
AAAAAA
BBBBBB
CCCCCC
DDDDDD
AAAAAA
BBBBBB
CCCCCC
2.4 sed高级编辑命令
1)格式
-
h:把模式空间中的内容覆盖至保持空间中
-
H:把模式空间中的内容追加至保持空间中
-
g:从保持空间取出数据覆盖至模式空间
-
G:从保持空间取出内容追加至模式空间
-
x:把模式空间中的内容与保持空间中的内容进行互换
-
n:读取匹配到的行的下一行覆盖 至模式空间
-
N:读取匹配到的行的下一行追加 至模式空间
-
d:删除模式空间中的行
-
D:删除 当前模式空间开端至\n 的内容(不再传 至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed
演示:使用sed 进行逆序
[root@CBDD test]# seq 10 | sed '1!G;h;$!d'
10
9
8
7
6
5
4
3
2
1
使用sed显示偶数行
[root@CBDD test]# seq 5 | sed -n 'n;P'
2
4
使用sed显示奇数行
[root@CBDD test]# seq 5 | sed 'H;n;d'
1
3
5
3、awk
awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。
awk其实不仅仅是工具软件,还是一种编程语言。不过,本文只介绍它的命令行用法,对于大多数场合,应该足够用了。
常用命令选项
-
-F fs:fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:
-
-v var=value:赋值一个用户定义变量,将外部变量传递给awk
-
-f scripfile:从脚本文件中读取awk命令
内置变量
(1)格式
-
FS :输入字段分隔符,默认为空白字符
-
OFS :输出字段分隔符,默认为空白字符
-
RS :输入记录分隔符,指定输入时的换行符,原换行符仍有效
-
ORS :输出记录分隔符,输出时用指定符号代替换行符
-
NF :字段数量,共有多少字段, $NF引用最后一列,$(NF-1)引用倒数第2列
-
NR :行号,后可跟多个文件,第二个文件行号继续从第一个文件最后行号开始
-
FNR :各文件分别计数, 行号,后跟一个文件和NR一样,跟多个文件,第二个文件行号从1开始
-
FILENAME :当前文件名
-
ARGC :命令行参数的个数
-
ARGV :数组,保存的是命令行所给定的各参数,查看参数
[root@CBDD test]# awk -v FS=':' '{print $1,$2}' ppp
hello world // 使用:为分隔符 打印 第一第二变量
12 34
a b
[root@CBDD test]# awk -v FS=':' '{print $1}' ppp
hello
12 // 只打印第一个
a
[root@CBDD test]# awk -v FS=':' -v OFS='+++' '{print $1,$2}' ppp
hello+++world
12+++34 // 输出分隔符为+++
a+++b
[root@CBDD test]# awk -F: '{print $(NF-1)}' ppp
hello
12 //打印倒数第二个
B
[root@CBDD test]# awk '{print NR}' ppp
1 // 打印行号
2
3
使用定时脚本阻止扫描器扫描
脚本:
logfile=/var/log/httpd/
last_minutes=1
start_time=`date -d"$last_minutes minutes ago" +"%d/%m/%Y:%H:%M:%S"
echo $start_time
stop_time=`date +"%d/%m/%Y:%H:%M:%S"
echo $stop_time
cur_date="date +%d/%m/%Y" //设置时间
echo $cur_date
tac $logfile/access.log | awk -v st="$start_time" -v et="$stop_time" '{t=substr($4,2);if(t>=st && t<=et){print $1}}' |sort | uniq -c | sort -nr > $logfile/log_ip_top10 //得到前十ip
ip=`cat $logfile/log_ip_top10 | awk '{if($1 > 100)print $2}'`
for line in $ip
do
echo $line >> $logfile/getip.txt
echo $line
iptables -I INPUT -p tcp -m multiport --dport 80,443 -s $line -j DROP // 封掉ip
done
加入任务计划