Linux三剑客命令练习

  • grep
  • sed
  • awk
  • 练习



用Linux命令分析统计日志数据之前,首先要会使用Linux三剑客:grep、sed、awk。

grep

  • 使用场景:更适用于简单的筛选查找。
  • 常用参数:
    -v 相反输出
    -n 显示匹配行行号
    -i 不区分大小写
    -c 只统计匹配的行数
    -o 只输出匹配的内容
    -E 使用egrep命令
  • 用法举例
模板:grep -参数 '条件' file
#找出与port有关的行并显示所在行号
grep -n "port" file
#去除空行
grep -v "^$" file
#只输出匹配的内容
grep -o "port" file
#找出同时与port和root有关的行
grep -E "port|root" file
#筛选有相似结构的字符串,如good和glad
grep -E "g(oo|la)d" file
#匹配y最少2次最多4次
grep -E "y{2,4}" file
#筛选全部(贪婪匹配)
grep ".*" file
#匹配所有字母
grep "[a-zA-Z]" file
#过滤0-5所有数字
grep "[^0-5]" file

sed

  • 使用场景:适用于对筛选到的数据进行增删改操作。
  • 常用参数:
    -n 取消默认输出全部(sed打印规则,符合的输出,不符合的也默认输出)
    -i 直接修改源文件
    -e 多次编辑,替代管道符
  • 内置命令字符:
    p 打印匹配内容
    d 删除匹配行
    a 在指定行后一行添加文本
    i 在指定行前一行插入文本
    s/正则/替换内容/g
  • 用法举例
模板:sed -参数 'sed内置命令字符' file
#删除第三行
sed '$3d' file
#打印2-5行
sed -n '2,5p' file
#打印第2行以及以下三行
sed -n '2,+3p' file
#去除空行
sed '/^$/d' file
#打印和linux有关的行
sed '/linux/p' file
#在源文件中删除和linux有关的行
sed -i '/linux/d' file
#从第三行删到结尾
sed '0,$d' file
#将文件中的my全替换为you
sed 's/my/you/g' file
#批量全局替换
sed -e 's/my/you/g' -e 's/qq/wechat/g' file
#在第2行后一行添加语句
sed '2a 添加语句内容' file
#在第2行前一行插入语句
sed '2i 添加语句内容' file
#在第2行前一行插入多行语句
sed '2i 语句1\n语句2' file
#每行后都添加-----
sed 'a -----' file

awk

  • 使用场景:更适合格式化文本,对文本进行较复杂格式处理。
  • 常用参数:
    -F 指定分割符分割
  • 内置变量:
    $0 全部记录
    $1 第一列
    NF 记录当前行分割后的字段数
    NR 记录当前行数
    $(NF-1) 倒数第二列
  • 用法举例
模板:awk -参数 '条件{动作}' file
#打印所有
awk '{print $0}' file
#打印第一列和最后一列
awk '{print $1,$NF}' file
#显示文件第五行
awk 'NR==5' file
#显示文件2-5行
awk 'NR==2,NR==5' file
#给每行内容添加行号
awk '{print NR,$0}' file
#打印2-5行内容并添加行号
awk 'NR==2,NR==5{print NR,$0}' file
#打印第1列,倒数第2列,倒数第3列
awk '{print $1,$(NF-1),$(NF-2)}' file
#自定义间隔符输出
awk '{print "第一列:"$1, "第二列:"$2}' file

练习

1. 统计log日志中出现次数最多的状态码前三个

awk -F'"' '{print $3}' access.log | awk '{print $1}'|  grep -v "^$" | sort | uniq -c | sort -nr | head -n 3

*分析过程:

先awk打印状态码所在的列,然后grep去除空行,sort排序便于后续去重,uniq去重,-c参数打印每个状态码具体重复个数,再sort -nr逆序排序,head打印数据量前三。

结果展示:

grep 数值过滤 grep过滤日志_服务器

2. 统计log日志中出现次数最多的IP地址前三个

awk '{print $1}' access.log | grep -v "^$" | sort | uniq -c | sort -nr | head -n 3

*分析过程:
先awk打印IP地址所在的列,然后grep去除空行,sort排序便于后续去重,uniq去重,-c参数打印每个IP具体重复个数,再sort -nr逆序排序,head打印数据量前三。

结果展示:

grep 数值过滤 grep过滤日志_服务器_02

注:关于为什么去重前后要sort两次,因为两次排序的目的不一样:第一次是为了方便uniq统计数据量,第二次是按统计量从大到小排序,方便head打印数据量前三。