- grep,sed,awk三剑客
- grep内容详解
- sed内容详解
- awk内容详解
- awk相关参数
- awk相关实例
- 输出以:为分隔符的第一和第二个参数
- 输出行号以及整行内容
- 输出每行拥有的字段个数
- 输出每行的最后一个字段
- 将以:分割的每个字段单行列出
- 将文件中的所有行合并成一行
- 将以:为分隔符的最后一个字段为/bin/bash的输出
- 将以:为分隔符的第一个字段不为root的输出
- 将以:为分隔符的第三个字段为0的输出
- 将以:为分隔符的第三个字段小于10的输出
- 打印一个文件中的第2列和第5列
- 打印出第二行第二列字段
- 统计一个文件的行数
- 显示管理员用户姓名
- 统计系统用户数量
- 每行打印两遍
- sort:排序,默认升序
- -k:指定列数
- -r:降序
- -n:以数值来排序
- uniq:去重
- -c:统计每行连续出现的次数
- 统计/etc/passwd中各种类型shell的数量
- 统计nginx日志出现的状态码
- 统计当前nginx日志中每个ip访问的数量
- 统计某一天的nginx日志中的不同ip的访问量
- 统计nginx日志中某一天访问最多的前10个ip
- 统计tcp连接的状态
- 统计UV
- 统计PV
- 统计url
- 查询访问最频繁的URL
- 查询访问最频繁的IP
grep,sed,awk三剑客
grep擅长查找功能,sed擅长取行和替换。awk擅长取列。
grep:Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。
sed:sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。如果没有使诸如‘D’ 的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到文件末尾。
awk:AWK是一种处理文本文件的语言。它将文件作为记录序列处理。在一般情况下,文件内容的每行都是一个记录。每行内容都会被分割成一系列的域,因此,我们可以认为一行的第一个词为第一个域,第二个词为第二个,以此类推。AWK程序是由一些处理特定模式的语句块构成的。AWK一次可以读取一个输入行。对每个输入行,AWK解释器会判断它是否符合程序中出现的各个模式,并执行符合的模式所对应的动作。
grep内容详解
grep参数常用实例:
-v 取反
-i 忽略字符大小写 grep -i root /etc/passwd 忽略root大小写显示所在的行
-n 显示匹配的行号 grep -n root /etc/passwd 显示出root所在的行号
-c 统计匹配的行数 grep -c root /etc/passwd 显示出拥有root的行数
-o 仅显示匹配到的字符串 grep -o root /etc/passwd 只显示root这个字符串
-e 实现多个选项间的逻辑or关系 grep –e ‘cat ‘ -e ‘dog’ file 可以支持过滤多个
-w 匹配整个单词 grep -w root /etc/passwd 只显示出root所在的整行
-E 使用ERE,相当于egrep
-F 相当于fgrep,不支持正则表达式
—color=auto 对匹配到的文本着色显示
-q 静默模式,不输出任何信息
-A # after, 后#行 cat -b passwd | grep mail -2 ##查看mail及上下两行
-B # before, 前#行 cat -b passwd | grep mail -A2 ##查看mail及下两行
-C # context, 前后各#行 cat -b passwd | grep mail -B2 ##查看mail及上两行
sed内容详解
sed参数
d 删除模式空间匹配的行,并立即启用下一轮循环
p 打印当前模式空间内容,追加到默认输出之后
a []text1 在指定行后面追加文本,支持使用\n实现多行追加
i []text 在行前面插入文本
c []text 替换行为单行或多行文本
w /path/somefile 保存模式匹配的行至指定文件
r /path/somefile 读取指定文件的文本至模式空间中匹配到的行后
= 为模式空间中的行打印行号
! 模式空间中匹配行取反处理
s///:查找替换,支持使用其它分隔符,s@@@,s###
替换标记:
g 行内全局替换
p 显示替换成功的行
w /PATH/TO/SOMEFILE 将替换成功的行保存至文件中
sed实例
sed搜索替换
搜索每一行匹配到MA的将第一个替换为Massachusetts: sed -r ‘s/MA/Massachusetts/‘ test.txt s:查找
搜索每一行,找到所有的MA字符,进行全局替换为Massachusetts:sed -r ‘s/MA/Massachusetts/g’ test.txt g:全局替换
搜索每一行,找到所有的MA字符,进行全局替换为Massachusetts同时忽略大小写:sed -r ‘s/MA/Massachusetts/gi’ test.txt -i:忽略大小写
静默输出(不打印默认输出):sed -r -n ‘s/MA/Massachusetts/‘ test.txt -n:静默输出
sed多重编辑选项
使用多重指令:-e 给予sed多个命令的时候需要-e选项
sed -r -e ‘s/MA/Massachusetts/‘ -e ‘s/PA/Pennsylvania/‘ test.txt
使用脚本文件:当有多个要编辑的项目时,可以将编辑命令放进一个脚本里,再使用sed搭配-f选项
-f
sed -f s.sed test.txt 将执行s.sed脚本的内容输出到终端
sed -f s.sed test.txt > newfile.txt 将执行s.sed脚本的内容输出到newfile.txt
sed增删改操作
d:表示删除
sed -r ‘1d’ passwd #删除文件的第1行
sed -r ‘1,2d’ passwd #删除文件的第1-2行
sed -r ‘2,$d’ passwd #删除第2行到最后一行
sed -r ‘/^root/d’ passwd #匹配到root开头的行,删除此行
sed -r ‘/root/d’ passwd #含有root的行都删除
sed -r ‘/bash/,3d’ passwd #匹配到bash行,从此行到第3行删除
sed -r ‘1~2d’ passwd #删除奇数行,间隔两行删除
sed ‘0~2d’ passwd #删除偶数行,从0开始间隔2行删除
插入命令—i
sed -r ‘2i\222222’ passwd 在第2行插入
修改命令—-c
sed -r ‘7c\SELINUX=enabled’ /etc/sysconfig/selinux 修改第七行
选项 -i 会使得sed用修改后的数据替换原文件
sed -r -i ‘7c\SELINUX=enabled’ /etc/sysconfig/selinux #修改第七行
sed -r -i ‘s/SELINUX=enabled/SELINUX=disabled/‘ /etc/sysconfig/selinux #替换第七行的SELINUX=enabled
由于在使用 -i 参数时比较危险, 所以我们在使用i参数时在后面加上.bak就会产生一个备份的文件,以防后悔
sed -r -i.bak ‘s/root/ROOT/‘ passwd 更改时候会生产一个备份文件
sed常见操作
sed -ri ‘/^#/d’ ssh_config 删除配置文件中 # 号注释的行
sed -r ‘2,5s/^/#/‘ passwd 给文件行添加注释
sed -r ‘s/^/#/‘ passwd 给所有行添加注释
sed -ri s/^#baseurl/baseurl/g /etc/passwd 给文件行添加注释
sed -r s/^mirrorlist/#mirrorlist/g /etc/passwd 给文件行取消注释
awk内容详解
语法格式:awk [options] ‘commands’ filenames
awk相关参数
1.记录和字段
awk 按记录处理:一行是一条记录,因为awk默认以换行符分开的字符串是一条记录。(默认\n换行符:记录分隔符)
字段:以字段分割符分割的字符串 默认是单个或多个“ ” tab键。
-F “:” 指定:为分割符
2.awk中的变量
$0:表示整行;
NF : 统计字段的个数
$NF:是number finally,表示最后一列的信息
RS:输入记录分隔符;
ORS:输出记录分隔符。
NR:打印记录号,(行号)
FNR:可以分开,按不同的文件打印行号。
FS : 输入字段分隔符,默认为一个空格。
OFS 输出的字段分隔符,默认为一个空格。
FILENAME 文件名 被处理的文件名称
$1 第一个字段,$2第二个字段,依次类推…
awk相关实例
输出以:为分隔符的第一和第二个参数
cat /etc/passwd | awk -F”:” ‘{print $1,$2}’
输出行号以及整行内容
cat /etc/passwd | awk ‘{print NR,$0}’
输出每行拥有的字段个数
cat /etc/passwd | awk -F”:” ‘{print NF}’
输出每行的最后一个字段
cat /etc/passwd | awk -F”:” ‘{print $NF}’
将以:分割的每个字段单行列出
cat d.txt | awk ‘BEGIN{RS=”:”} {print $0}’
将文件中的所有行合并成一行
cat /etc/passwd | awk ‘BEGIN{ORS=”” } {print $0}’
将以:为分隔符的最后一个字段为/bin/bash的输出
awk -F”:” ‘$NF == “/bin/bash”‘ /etc/passwd
将以:为分隔符的第一个字段不为root的输出
awk -F”:” ‘$1 != “root”‘ /etc/passwd
将以:为分隔符的第三个字段为0的输出
awk -F”:” ‘$3 == 0’ /etc/passwd
将以:为分隔符的第三个字段小于10的输出
awk -F”:” ‘$3 < 10’ /etc/passwd
打印一个文件中的第2列和第5列
cat /etc/passwd | awk -F : ‘{print $2,$5}’
打印出第二行第二列字段
free -m | awk ‘NR==2 {print $2}’
统计一个文件的行数
cat /etc/passwd | awk ‘{print NR}’
显示管理员用户姓名
cat /etc/passwd | awk -F”:” ‘{if($3==0) {print $1 “ is administrator”}}’
统计系统用户数量
cat /etc/passwd | awk -F”:” ‘{if($3>=0 && $3<=1000){i++}} END{print i}’
每行打印两遍
awk ‘{for(i=1;i<=2;i++) {print $0}}’ /etc/passwd
sort:排序,默认升序
-k:指定列数
-r:降序
-n:以数值来排序
uniq:去重
-c:统计每行连续出现的次数
统计/etc/passwd中各种类型shell的数量
cat /etc/passwd | awk -F: ‘{shells[$NF]++} END{ for(i in shells){print i,shells[i]} }’
统计nginx日志出现的状态码
cat access.log | awk ‘{stat[$9]++} END{for(i in stat){print i,stat[i]}}’
统计当前nginx日志中每个ip访问的数量
cat access.log | awk ‘{ips[$1]++} END{for(i in ips){print i,ips[i]}}’
统计某一天的nginx日志中的不同ip的访问量
cat access.log |grep ‘28/Sep/2019’ | awk ‘{ips[$1]++} END{for(i in ips){print i,ips[i]}}’
统计nginx日志中某一天访问最多的前10个ip
cat access.log |grep ‘28/Sep/2019’ | awk ‘{ips[$1]++} END{for(i in ips){print i,ips[i]}}’ |sort -k2 -rn | head -n 10
统计tcp连接的状态
netstat -n | awk ‘/^tcp/ {tcps[$NF]++} END {for(i in tcps) {print i, tcps[i]}}’
统计UV
cat access.log | awk ‘{print $1}’ |sort |uniq | wc -l
统计PV
cat access.log | awk ‘{print $1}’ |wc -l
统计url
cat access.log | awk ‘{print $7}’ |wc -l
查询访问最频繁的URL
cat access.log | awk ‘{print $7}’|sort | uniq -c |sort -n -k 1 -r | more
查询访问最频繁的IP
cat access.log | awk ‘{print $1}’|sort | uniq -c |sort -n -k 1 -r | more
