20分钟降服Linux三剑客老大awk,让人拍案叫绝

简介: 20分钟降服Linux三剑客老大awk,让人拍案叫绝

🚀 1.awk介绍



🌈 1.1 什么是AWK


对于接触过Linux操作系统的人来说,应该都听过说Linux中的文本三剑客吧,即awk、grep、sed,也是必须要掌握的Linux命令之一,三者都是用来处理文本的,但侧重点各不相同,awk功能最强大,但也最复杂


d17d2cec642a49a182a799184b796f2b.png

awk是一种编程语言,用于在Linux/Unix下对文本和数据进行处理,数据可以来自标准输入、一个或多个文件,或其他命令的输出,它支持用户自定义函数和动态正则表达式等先进功能,是Linux/Unix下的一个强大编程工具,它在命令行中使用,但更多是作为脚本来使用。

awk有很多内建的函数,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优点。


🌈 1.2 AWK 的工作流程


AWK 工作流程可分为三个部分:

读输入文件之前执行的代码段(由BEGIN关键字标识)。

主循环执行输入文件的代码段。

读输入文件之后的代码段(由END关键字标识)。


命令结构

awk ‘BEGIN{ commands } pattern{ commands } END{ commands }’

359be23551544e18902815cfd505c867.png


🚀 2.awk实战案例



🌈 2.1 格式化空白


🚩 移除每行的前缀、后缀空白,并将各部分左对齐。


      aaaa        bbb     ccc                 
   bbb     aaa ccc
ddd       fff             eee gg hh ii jj


awk ‘BEGIN{OFS=“\t”}{$1=$1;print}’ a.txt


✨✨ 执行结果:


aaaa    bbb     ccc
bbb     aaa     ccc
ddd     fff     eee     gg      hh      ii      jj


🌈 2.2 根据某字段去重


🚩 去掉uid=xxx重复的行。


2022-01-13_12:00_index?uid=123

2022-01-13_13:00_index?uid=123

2022-01-13_14:00_index?uid=333

2022-01-13_15:00_index?uid=9710

2022-01-14_12:00_index?uid=123

2022-01-14_13:00_index?uid=123

2022-01-15_14:00_index?uid=333

2022-01-16_15:00_index?uid=9710


awk -F"?" ‘!arr[$2]++{print}’ a.txt


✨✨ 执行结果


2022-01-13_12:00_index?uid=123

2022-01-13_14:00_index?uid=333

2022-01-13_15:00_index?uid=9710


🌈 2.3 统计次数


🚩 统计文本中出现的次数


portmapper
portmapper
portmapper
portmapper
portmapper
portmapper
status
status
mountd
mountd
mountd
mountd
mountd
mountd


awk ‘{arr[$1]++}END{OFS=“\t”;for(idx in arr){printf arr[idx],idx}}’ a.txt


✨✨ 执行结果


6: portmapper
2: status
6: mountd


🌈 2.4 行转列


🚩 将以下文本行转列


name age
alice 21
ryan 30


awk ’

{

for(i=1;i<=NF;i++){

if(!(i in arr)){

arr[i]=KaTeX parse error: Expected 'EOF', got '}' at position 11: i }̲ else { …i

}

}

}

END{

for(i=1;i<=NF;i++){

print arr[i]

}

}

’ a.txt


✨✨ 执行结果


name alice ryan
age 21 30


🌈 2.5 列转行


🚩 就是只要第一列数字相同, 就把他们的第二列放一行上,中间空格分开


74683 1001
74683 1002
74683 1011
74684 1000
74684 1001
74684 1002
74685 1001
74685 1011
74686 1000
....
100085 1000
100085 1001


 

if($1 in arr){

arr[$1] = arr[$1]" "$2

} else {

arr[$1] = $2

}

}

END{

for(i in arr){

printf “%s %s\n”,i,arr[i]

}

}


✨✨ 执行结果


74683 1001 1002 1011
74684 1000 1001 1002
...


🌈 2.6 统计多项数据


🚩如下内容,第一个字段是IP,第二个字段是每个访问的uri。

要求统计出每个ip访问的总次数,以及每个ip所访问的uri的次数。


1.1.1.1 /index1.html
1.1.1.1 /index1.html
1.1.1.1 /index2.html
1.1.1.1 /index2.html
1.1.1.1 /index2.html
1.1.1.1 /index3.html
1.1.1.2 /index1.html
1.1.1.2 /index2.html
1.1.1.2 /index2.html
1.1.1.3 /index1.html
1.1.1.3 /index1.html
1.1.1.3 /index2.html
1.1.1.3 /index2.html
1.1.1.3 /index2.html
1.1.1.3 /index3.html
1.1.1.3 /index3.html
1.1.1.4 /index2.html
1.1.1.4 /index2.html


使用复合索引的数组


awk ’

{

a[$1]++

b[$1"“$2]++
}
END{
for(i in b){
split(i,c,”
");

print c[1],a[c[1]],c[2],b[i]

}

}’ a.log


✨✨ 执行结果


1.1.1.1 6 /index3.html 1
1.1.1.1 6 /index2.html 3
1.1.1.1 6 /index1.html 2
1.1.1.2 3 /index2.html 2
1.1.1.2 3 /index1.html 1
1.1.1.3 7 /index3.html 2
1.1.1.3 7 /index2.html 3
1.1.1.3 7 /index1.html 2
1.1.1.4 2 /index2.html 2


🚀 3.awk常用命令



🌈 3.1 awk查看某个时间段的日志


awk ‘/^开始时间日期/,/^结束时间日期/’ nginx.log
awk支持正则表达式,比如,查询时间段2021-03-24 10:12:12 到 2021-09-24 10:12:12,
可以用awk ‘/^2021-03-24 10:12:*/,/^2021-09-24 10:12:*/’ nginx.log查询。


🌈 3.2 统计命令


# 求和
cat data|awk '{sum+=$1} END {print "Sum = ", sum}'
# 求平均
cat data|awk '{sum+=$1} END {print "Average = ", sum/NR}'
# 求最大值
cat data|awk 'BEGIN {max = 0} {if ($1>max) max=$1 fi} END {print "Max=", max}'
# 求最小值(min的初始值设置一个超大数即可)
awk 'BEGIN {min = 1999999} {if ($1<min) min=$1 fi} END {print "Min=", min}'



🌈 3.3 awk 内置变量表

84a710a16140495b9f1158521396f5ff.png

🌈 3.5 awk 字符串函数

772bb55e262c475aa642eab90463ab82.png


🌈 3.6 其他


1、打印文件的第一列(域)     : awk ‘{print $1}’ filename

2、打印文件的前两列(域)     : awk ‘{print $1,$2}’ filename

3、打印完第一列,然后打印第二列 : awk ‘{print $1 $2}’ filename

4、打印文本文件的总行数     : awk ‘END{print NR}’ filename

5、打印文本第一行         :awk ‘NR==1{print}’ filename

6、打印文本第二行第一列     :sed -n “2p” filename | awk ‘{print $1}’


目录
相关文章
|
18天前
|
Linux Perl
Linux|从 STDIN 读取 Awk 输入
Linux|从 STDIN 读取 Awk 输入
25 4
|
18天前
|
Linux Perl
Linux技巧|Awk 比较运算符
在 Awk 中,使用比较运算符(如 &gt;, &lt;, ==, != 等)可方便地过滤文本和字符串。本文通过示例展示了如何处理食品购物清单,标记数量小于或等于 20 的商品。 Awk 语法 `expression { actions; }` 用于根据条件执行操作,如在满足条件的行末尾添加特殊标记。例如,`$3 &lt;= 20 { printf &quot;%s\t%s\n&quot;, $0,&quot;TRUE&quot; ; }` 会在数量小于或等于 20 的行后添加 &quot;TRUE&quot;。继续探索 Awk 的比较运算符以进行更复杂的文本处理。
29 2
|
18天前
|
搜索推荐 Linux 开发工具
【Linux】深入理解awk命令
【Linux】深入理解awk命令
51 0
|
18天前
|
Linux Perl
百度搜索:蓝易云【Linux常用命令awk】
以上仅是awk命令的一些常见用法,它还有许多更复杂的功能和用法,可以根据需要灵活运用。awk在文本处理和数据分析中非常实用,是Linux系统中的一把利器。
26 2
|
18天前
|
网络协议 关系型数据库 MySQL
Linux awk
Linux awk
31 0
|
18天前
|
监控 Linux BI
linux命令之awk
linux命令之awk
28 4
|
18天前
|
Unix Java Linux
Linux脚本中的字符处理与awk编程|WC统计
Linux脚本中的字符处理与awk编程|WC统计
61 0
|
7月前
|
存储 Linux Shell
Linux awk命令
除了使用 sed 命令,Linux 系统中还有一个功能更加强大的文本数据处理工具,就是 awk。 曾有人推测 awk 命令的名字来源于 awkward 这个单词。其实不然,此命令的设计者有 3 位,他们的姓分别是 Aho、Weingberger 和 Kernighan,awk 就取自这 3 为大师姓的首字母。 和 sed 命令类似,awk 命令也是逐行扫描文件(从第 1 行到最后一行),寻找含有目标文本的行,如果匹配成功,则会在该行上执行用户想要的操作;反之,则不对行做任何处理。awk 命令的基本格式为: [root@localhost ~]# awk [选项] '脚本命令' 文件名
79 1
|
8月前
|
Unix 测试技术 Linux
软件测试|Linux三剑客之awk命令详解
软件测试|Linux三剑客之awk命令详解
72 0
|
18天前
|
存储 监控 Linux
性能工具之linux三剑客awk、grep、sed详解
Linux 三剑客 awk,sed和grep 在性能领域广泛用于性能建模、性能监控及性能分析等方面,也是各大互联网公司测试岗高频面试题,中高端测试人员必备技能之一。
63 1
性能工具之linux三剑客awk、grep、sed详解