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字符)后向应引用反向引用sed | egrep '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
命令 | 含义 | |
---|---|---|
c | replace 替代这行内容 | |
a | append 追加向指定行或每一行追加内容(行后面) | |
i | insert 插入指定行或每一行插入内容(行前面) |
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####g | s—>sub 替换 |
s@@@g | g—>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内置变量
内置变量 | |
---|---|
NR | Number of Record 记录号,行号 |
NF | Number of Field 每行有多个字段(列) $NF 最后一列 |
FS | -F: === -v FS=: Field Separator 字段分割符每个字段结束符 |
OFS | OutField 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]=lidao | array[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