Linux--文本三剑客

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

加入任务计划

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值