awk小实践3

目录

  • 写在前面
  • 实践
    • [1. 取出域名并统计排序](#1. 取出域名并统计排序)
    • [2. 再上一题的基础上,修改输出格式](#2. 再上一题的基础上,修改输出格式)
    • [3. 根据`1`的输出,修改连接符`.`为`\`](#3. 根据`1`的输出,修改连接符`.`为``)
    • [4. 根据`1`的答案,仅匹配出现`t`的url](#4. 根据1的答案,仅匹配出现t的url)
    • [5. 匹配access.log文件中的状态码出现次数(状态码在第9列)](#5. 匹配access.log文件中的状态码出现次数(状态码在第9列))
    • [6. 匹配access.log文件中的流量总数(第10列)](#6. 匹配access.log文件中的流量总数(第10列))

写在前面

基本语法:

bash 复制代码
awk options 'pattern {action}' file
# options:是一些选项,用于控制 awk 的行为。
# pattern:是用于匹配输入数据的模式。如果省略,则 awk 将对所有行进行操作。
# {action}:是在匹配到模式的行上执行的动作。如果省略,则默认动作是打印整行。

awk也支持正则,在pattern内使用/ xxx / 编写正则或需要匹配的内容。

awk用BEGIN{}和END{},分别用于执行匹配操作前和执行完匹配操作后的action

shell 复制代码
#常用的参数
-F :更换匹配词,默认为空格;
$NF : 最后一列
NR : 代指为行
-f :指定awk匹配语句的脚本文件

awk也支持运算符:

匹配符 含义
= += -= *= /= %= ^= **= 赋值
?: C条件表达式
|| 逻辑或
&& 逻辑与
~ 和 !~ 匹配正则表达式和不匹配正则表达式
< <= > >= != == 关系运算符
空格 连接
+ - 加,减
* / % 乘,除与求余
+ - ! 一元加,减和逻辑非
^ *** 求幂
++ -- 增加或减少,作为前缀或后缀
$ 字段引用
in 数组成员

三剑客的专业比较

在文本处理领域,grepsedawk 各具特色,适用于不同的场景:

  • grep 是一个强大的文本搜索工具,它专注于基于模式的文本查找和匹配,适合于执行快速的文本搜索任务。
  • sed(Stream Editor)是一个流编辑器,它擅长于对匹配到的文本执行编辑操作,如替换、删除和插入文本
  • awk 是一个多功能文本处理工具,特别适合于格式化文本和执行复杂的文本处理任务,如数据提取、报表生成和复杂的字段操作。

实践

1. 取出域名并统计排序

shell 复制代码
cat url.txt
http://www.baidu.com/index.html
http://taobao.com/1.html
http://openeuler.org/index.html
http://testtestest.test/index.html
http://taobao.com/3.html
http://e.huawei.com/
http://openeuler.org/index2.html
http://openeuler.org/index3.html
http://openeuler.org/index4.html
http://openeuler.org/index5.html
http://openeuler.org/index6.html

解法

shell 复制代码
awk -F'/+' '{print $2}' url.txt | sort | uniq -c | sort -rn
      6 openeuler.org
      2 taobao.com
      1 www.baidu.com
      1 testtestest.test
      1 e.huawei.com

2. 再上一题的基础上,修改输出格式

shell 复制代码
#输出为:
URL:xxx COUNT:xxx

解法

shell 复制代码
awk -F'/+' '{print $2}' url.txt | sort | uniq -c | sort -rn | awk '{print "URL: " $2  "  \tCOUNT :" $1}'
URL: openeuler.org      COUNT :6
URL: taobao.com         COUNT :2
URL: www.baidu.com      COUNT :1
URL: testtestest.test   COUNT :1
URL: e.huawei.com       COUNT :1

3. 根据1的输出,修改连接符.$

shell 复制代码
输出为
6 openeuler$org

解法

shell 复制代码
awk -F'/+' '{print $2}' url.txt | sort | uniq -c | sort -rn | awk '{gsub("\\.","$",$2);print $2 "---"$1}'
openeuler$org---6
taobao$com---2
www$baidu$com---1
testtestest$test---1
e$huawei$com---1

#这里使用了\\双反斜杠,因为使用单反斜杠出现报错:
#   awk: cmd. line:1: warning: escape sequence `\.' treated as plain `.'

#sub函数用于替换字符串中的第一个匹配项。
#sub(regexp, SubstitutionReplacement, target)
#regexp是用于匹配正则表达式的模式
#replacement是要替换的字符串
#target是要进行替换操作的字符串。
#gsub是替换所有匹配项
shell 复制代码
#使用sed更方便且效果类似:sed 's|\.|$|g'
 awk -F'/+' '{print $2}' url.txt | sort | uniq -c | sort -rn | sed 's|\.|$|g'
       6 openeuler$org
      2 taobao$com
      1 www$baidu$com
      1 testtestest$test
      1 e$huawei$com

4. 根据1的答案,仅匹配出现t的url

shell 复制代码
#Output
taobao.com
testtestest.test

解法

shell 复制代码
awk -F'/+' '{print $2}' url.txt | sort | uniq -c | sort -rn | awk '$2~/t/{print $2}'
taobao.com
testtestest.test

5. 匹配access.log文件中的状态码出现次数(状态码在第9列)

解法

shell 复制代码
awk '{print $9}'access.log | sort | uniq -c| sort -rn 

6. 匹配access.log文件中的流量总数(第10列)

解法

shell 复制代码
awk '{sum+=$10}END{print sum}' access.log

{sum+=$10}:这是 awk 程序的pattern模式部分。

对于 access.log 文件中的每一行,这个模式都会执行。

$10 表示当前行的第十个字段(字段由空白字符分隔,如空格或制表符)。

sum+=$10 的意思是将第十个字段的值累加到变量 sum 上。如果第十个字段不存在(即该行少于10个字段),awk 会将其视为0。
END:这是一个特殊的模式,在处理完所有行之后执行。在 awk 中,END 模式块用于在所有数据行处理完毕后执行的操作。
{print sum}:这是 END 模式对应的action操作。它将打印变量 sum 的值,即所有第十列字段值的总和。

相关推荐
YRr YRr2 分钟前
Unix-like 系统中的文件所有权管理:使用 sudo chown -R 命令的详解与实践应用
linux·服务器·unix
花花花12 分钟前
秒变 Vim 高手:必学的编辑技巧与隐藏功能大揭秘
linux·ubuntu·编辑器·vim·excel·shell
铁板鱿鱼14011 分钟前
docker基本(仅供自己参考)
运维·docker·容器
沥川同学40 分钟前
从零开始学习Linux(13)---多线程
linux·运维·服务器·学习·ubuntu
金刚狼881 小时前
lsof可以查看当前系统中正在被使用的文件,包括动态库
linux
懒大王敲代码1 小时前
openEuler系统安装内网穿透工具实现其他设备公网环境远程ssh连接
运维·ssh
weixin_464838151 小时前
/etc/sudoers文件中的哪些配置会影响系统安全?
linux·网络安全
今天开始奋斗吧1 小时前
docker
linux·服务器·学习
2024071866801 小时前
linux cat命令的实现
linux·运维·服务器
man20172 小时前
LNMP环境搭建、部署的整体流程和详细步骤
linux·mysql·nginx·php