grep sed awk详解

1、基本正则

  • 基本正则解释实例
    ^以什么开头grep ‘^1’ id.txt 匹配以1开头 cat -A
    $以什么结尾grep ‘448$’ id.txt
    ^$空行 这一行没有任何内容(空格也是)grep -n ‘^KaTeX parse error: Expected group after '^' at position 94: … grep -v '^̲’ id.txt 排除文件中空行 、#号行
    .任何一个字符,不匹配空行grep -n ‘.’ id.txt
    *前一个字符出现0次或0次以上)相当于cat,啥都输出
    . *所有内容,任何内容,任意内容、最大匹配(贪婪性)grep ‘^.*t$’ id.txt 匹配最后一个以t结尾的行
    [][abc] 1次匹配1个字符,匹配任何字符[a or b or c]grep -o ‘[abc]’ id.txt -o 显示匹配过程 grep ‘[a-zA-Z0-9]’ id.txt 推荐写法 grep ‘[a-Z0-9]’ id.txt grep -i ‘[a-z0-9]’ id.txt 不区分大小写
    [^]括号内取反[^abc] 取反,排除a,b,c,外的
    \n \t转义字符序列
    [a-z|A-Z|0-9] 匹配任何字符包含|
    

2、扩展正则 egrep

  • 扩展正则
+  |() {}
符号解释
+前1个字符连续出现1次或1次以上egrep ‘[0-9]+’ id.txt 输出数字行
|egrep ‘abc|addf’ id.txt
()被括起来的内容,表示一个整体(一个i字符)后向应引用反向引用sedegrep 'ab(c|d) ’ id.txt egrep ‘ab[cd]’ id.txt
{}连续出现o{n,m},前一个字母o 至少出现n次,最多连续出现m次,o{n}前一个字母o连续出现n次
?前一个字符连续出现0次或1次

3、grep

grep -A5 匹配接下来5行 
grep -B5 匹配接上面5行
grep -C  上下5行
ps -aux | grep sshd | wc -l 统计
ps -aux | grep -c  sshd  同wc -l
ps -aux | grep ssh | grep -v grep| wc -l排除自己grep
grep -w  22  精确匹配 22

3、sed

特点及格式

​ sed 流编辑器(stream editor)
​ sed 格式 sed -r ‘s#abc#abc|#g’ id.txt
​ sed核心功能 增删改查
​ s 替换
​ p 显示print
​ d 删除 行为单位
​ cai 增加c/a/i

sed命令执行过程

​ 四个字描述 找谁干啥
​ 找谁 你要那行
​ 干啥 增删改查
​ sed一行一行读到内存中,再一行一行判断条件
​ sed -n 取消默认输出

sed核心应用

sed  '3p' id.txt  默认输出 3p 指定行号

sed -n '3p' id.txt 输出第三行 只输出第三	行

sed -n  ‘1,3p’   id.txt   输出1到3行

sed -n '4, $p'  匹配4行到最后一行

sed 过滤

sed -n ‘/10/p’  包含10显示

sed -n  ‘/[45]/p’  包含4或5

sed范围过滤

sed -n ‘/102/,/105/p’ 匹配从包含“102”行到包含“105”行

实际生产环境查看log

head / tail/ less /more/sed /awk

sed -n ‘/11:02:30/p’ access.log

sed -n ‘/11:02:30/,/11:03:14/p’ access.log

不指定结尾或结尾错误直接显示到结尾

查找格式
‘2p’指定行行号进行查找
‘1,5p’指定行号范围进行查找
‘/lidao/p’类似于grep,过滤,//里面可以写正则
‘/10:00/,/11:00/p’表示范围的过滤
1,/oldboy/混合(了解)

sed 删除

查找格式
‘2d’指定行行号进行查找
‘1,5d’指定行号范围进行查找
‘/lidao/d’类似于grep,过滤,//里面可以写正则
‘/10:00/,/11:00/d’表示范围的过滤
egrep -v   '^$|#'  /etc/ssh/sshd_config  删除文件中的空行包含#号

sed   -r   '/^$|#/d'  /etc/ssh/sshd_config  删除sshd文件中空行和#号
#   ! 的妙用
sed   -rn   '/^$|#/!p'  /etc/ssh/shd_config  空行#号不显示

sed 增加cai

命令含义
creplace 替代这行内容
aappend 追加向指定行或每一行追加内容(行后面)
iinsert 插入指定行或每一行插入内容(行前面)
sed   '3a 996 sss'  id.txt  第三行追加996 sss
  • 企业案列向文件追加多行内容
向config里面追加
USERDNS no
GSSAPIAUTACTION no
PeritrootLogin no`在这里插入代码片`
#方法1:
cat >>config << 'EOF'  向config 追加 并以EOF结束
USERDNS no
GSSAPIAUTACTION no
PeritrootLogin no
EOF
#方法2:sed
sed -i  '$a USERDNS no \n GSSAPIAUTACTION no \n PeritrootLogin no' config

sed 替换

替换格式
s####gs—>sub 替换
s@@@gg—>global 全局替换 sed 默认只替换每行第一个匹配的内容
s///g
sed 's#[0-9]##g'  id.txt   替换每行中数字替换为空 

echo 123456 | sed -r 's#(.*)#<\1>#g'     \1 代表第一个()中内容 先保护再使用
echo  "lidao_12345"  | sed -r 's#(^.*)_(.*$)#\2_\1#g'
12345_lidao
ifconfig ens33 | sed -rn '2s#.*t (.*) n.*$#\1#gp' #192.168.0.100 

4、awk

特点及应用

awk
一门语言类似c语言
过滤统计,计算
过滤统计日志

执行过程

awk -F, 'BEGIN{print "name"}{print $2}END{print "end of file"}'  /etc/passwd

在这里插入图片描述

awk 行与列

名词awk 中叫法一些说明
记录record每一行默认通过回车分割
字段,域field每一列默认通过空格分割
awk 中行和列结束标记都可以修改

awk取行

awk
NR==1取出一行
NR>=1 && NR<=5取出1到5行范围
符号> < >=<= == !=
awk  'NR==1'  /etc/passwd
AWK '/101/,/105/' /etc/passwd  
AWK  '/root/'   /etc/passwd  
awk   'NR >=1 && NR<=5' /etc/passwd

awk取列

  • -F 指定分割符 指定每一列结束标记默认是空格,连续的空格tab键

  • 数字取出某一列,注意 a w k 中 数字取出某一列,注意awk中 数字取出某一列,注意awk内容一个意思,表示取出一列

  • $0整行的内容

    ls -l |awk '{print $5,$9}' | column -t
    

awk内置变量

内置变量
NRNumber of Record 记录号,行号
NFNumber of Field 每行有多个字段(列) $NF 最后一列
FS-F: === -v FS=: Field Separator 字段分割符每个字段结束符
OFSOutField Seqarator 字段分割 awk显示每一列的时候,每一列通过什么分割 默认是空格
awk -F: '{print $1,$NF}'  /etc/passwd | column -t
awk -F: '{print $1"@@"$NF}'  /etc/passwd | column -t
awk  -F: -v OFS=: '{print $6,$2,$3,$4,$5,$6,$1}' /etc/passwd

小结

  • 行与列 名称
ip a s ens33 | awk -F"[ /]+"  'NR==3{print $3}'

awk模式匹配

  • 谁可以作为awk的条件
awk-F"[ /]+"‘NR==3{print $3}’
‘条件(动作)’
‘找谁(干啥)’
‘模式(动作)’
‘pattern(action)’
  • 比较符号:>< <= >= == !=
  • 正则
  • 范围表达式
  • 特殊条件:BEGIN 和 END

比较表达式-参考上面取行部分

正则

  • //支持扩展正则
  • awk 可以精确到某一列,某一列中包含/不包含…内容
  • ~包含
  • !~不包含
正则awk正则
^表示已…开头的行某一列的开头 $3~/^o/root/
$ 表示以…结尾的行某一列的结尾 4   / l i d a o 4~/lidao 4 /lidao/
^$ 表示空行某一列是空的 很少用
awk -F: '$3~/^2/{print $1,$3,$NF}'  /etc/passwd 
awk -F: '$3~/^[12]/{print $1,$2,$3,$NF}' /etc/passwd

表示范围

  • /哪里开始/ /哪里结束/ =常用=

    NR==1,NR==5 从第一行开始到第五行结束 类似于sed -n ’1,5p‘
    #显示指定时间(11:02:00到11:02:03)范围内容的ip地址和用户访问url
    awk '/11:02:11/,/11:02:03/{print $1,$7,$9,$10}' access.log
    

特殊模式BEGIN{} 和END{}

模式含义进行简单统计,计算,不涉及读取文件
BEGIN{}里面的内容会在awk读取文件之前执行进行简单统计,计算,不涉及读取文件(常见)
用来处理文件之前,添加个表头(了解)
用来定义awk变量(很少用,应为可以用-v)
END{}里面的内容会在awk读取文件之后执行awk进行统计,一般过程:先进行计算,最后END里面输出结果(常见)
awk使用数组,哟过来输出组结果(常见)
  • END统计计算
  • 统计方法:i++ i=i+1
统计方法
i++i=i+1计数,统计次数
sum=sum+???sum+=???求和,累加
array[]=array[]++array[]++数组分类计数
注意:i,sum都是变量
#统计/etc/serivces 里面有多少个空行
awk '/^$/{i++}END{print i}'  /etc/services  #17个空行行
seq 100 | awk '{sum=sum+$1}END{print sum}'  #5050
seq 100 | awk '{sum=sum+$1;print sum}END{print sum}'  #5050

awk数组

  • 统计日志:类似于
  • 统计次数:统计每个ip出现次数,统计每种状态码出现次数,统计系统中每个用户被攻击的次数,统计攻击者ip出现次数
  • 累计求和:统计每个ip消耗的流量
shell数组awk数组
形式array[0]=oldboy array[1]=lidaoarray[0]=oldboy array[1]=lidao
使用echo ${array[0]} ${array[1]}print array[0] array[1]
批量输出数组内容for i in ${array[*]}
do
echo $i
done
for(i in array)
print i ,array[i]
awk数组专用循环,变量获取到的是数组的下标,你想要数组内容数组a[i]
awk 'BEGIN{a[0]=oldboy;a[1]=lidao;print a[0],a[1]}'   #字符再awk中会当成变量
awk 'BEGIN{a[0]="oldboy";a[1]="lidao";print a[0],a[1]}' #字符加双引号,数字不用加
awk 'BEGIN{a[0]="oldboy";a[1]="lidao";for(i in a) print a[i] }'
  • 案列
#处理以下文件内容,将域名取出并根据域名进行计数排序处理:(百度和sohu面试题)
http://www.etiantian.org/index.html
http://www.etiantian.org/1.html
http://post.etiantian.org/index.html
http://mp3.etiantian.org/index.html
http://www.etiantian.org/3.html
http://post.etiantian.org/2.html


www.etiantian.org
post.etiantian.org
mp3.etiantian.org
awk -F"[/.]+"  '{array[$2]++}END{for(i in array)print i,array[i]}' url.txt  #统计分类
www 3
mp3 1
post 2
awk -F"[/.]+"  '{array[$2]++}END{for(i in array)print i,array[i]}'  url.txt | sort -nrk2
www 3
post 2
mp3 1

for循环

for n  in 1 2 3
do
	echo $n
done
shell 编程c语言for循环awk for 循环
for((i=1;i<=10;i++))
do
echo $i
done
for(i=1;i<=10;i++)
print i
awk for循环用来循环每个字段
#100
awk 'BEGIN{for(i=1;i<=100;i++)sum+=i;print sum}'
awk 'BEGIN{for(i=1;i<=100;i++) sum+=i print sum}'
awk 'BEGIN{for(i=1;i<=100;i++) {sum+=i ;print sum}}'

if判断

shell if判断awk if
if[ “age” -eq 18 ];then
echo name
fi
if(条件)
print “test”
if[ “age” -eq 18 ];then
echo name
else
echo “test”
fi
if()
print “test”
else
print “test”
df -h|awk  -F'[ %]+' 'NR>1{if($5>10)print $5}'
13
14

  • 面试题:统计这段语句中,单词中字符数小于6的单词

    echo i am oldboy teacher welcomr to oldboy traning class.|awk -F"[ .]" '{for(i=1;i<=NF;i++) if(length($i)<6)print $i}'
    i
    am
    to
    class
    
    

总结

  • gawk gnu awk
  • awk选项-F -v
  • awk执行流程
  • awk取行与取列:指哪打哪
  • awk模式:正则,范围,特殊模式,比较
  • awk数组:统计分析日志
  • awk for if
  • man awk /info awk
  • 目标
    • 计次数
    • ​ access.log 统计每个ip出现次数,统计每种状态码出现次数
    • secure 统计系统中每个用户被攻击的次数,统计攻击者ip出现次数
    • 累加求和:统计每个ip消耗的流量 access.log
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1. grep grep 的基本语法为: ``` grep [OPTION]... PATTERN [FILE]... ``` 其中,`PATTERN` 是要搜索的字符串或正则表达式,`FILE` 是要搜索的文件名。如果不指定 `FILE`,则默认从标准输入读取数据。 常用的选项包括: - `-i`:忽略大小写。 - `-v`:反向匹配,输出不包含 `PATTERN` 的行。 - `-n`:输出匹配行的行号。 - `-r`:递归搜索一个目录下的所有文件。 - `-E`:使用扩展正则表达式。 - `-w`:匹配整个单词,而不是子字符串。 例如,要在文件 `file.txt` 中搜索所有包含 `hello` 的行,可以使用: ``` grep hello file.txt ``` 2. sed sed 的基本语法为: ``` sed [OPTION]... {script-only-if-no-other-script} [input-file]... ``` 其中,`script` 是要执行的编辑命令,支持多个命令以分号分隔。如果不指定 `input-file`,则默认从标准输入读取数据。 常用的命令包括: - `s/PATTERN/REPLACEMENT/g`:替换文本中的 `PATTERN` 为 `REPLACEMENT`,`g` 表示全局替换。 - `d`:删除匹配行。 - `p`:输出匹配行。 - `n`:读入下一行,替换模式空间中的内容,并打印输出。 例如,要将文件 `file.txt` 中的所有 `hello` 替换为 `world`,可以使用: ``` sed 's/hello/world/g' file.txt ``` 3. awk awk 的基本语法为: ``` awk [OPTIONS] 'pattern {action}' file ``` 其中,`pattern` 是要匹配的条件,`action` 是要执行的操作。如果不指定 `file`,则默认从标准输入读取数据。 常用的命令包括: - `$0`:表示整个文本行。 - `$1`:表示第一个字段,以空格为分隔符。 - `-F`:指定字段分隔符。 - `BEGIN`:在处理文件之前执行的命令。 - `END`:在处理文件之后执行的命令。 例如,要在文件 `file.txt` 中输出第二列的内容,可以使用: ``` awk '{print $2}' file.txt ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值