掘金 后端 ( ) • 2024-04-28 13:26

每日一个linux命令之awk

awk是linux用来处理文本文件的重要命令。它能一次处理文本文件中的每一行,读取其中的字段。对于处理csv文件或者日志文件,awk是个比较好用的工具。

基本用法

#格式
awk 操作 文件
#举例
awk '{print $0}' text.txt

上述示例表示,输出text.txt文件的所有内容,单引号内的大括号框起来的就是操作,print $0表示一个打印操作,$0表示当前行。因此该命令就是逐行打印text.txt文件的内容。

举例,我们现在有一个text.txt文件,文件内容如下:

this is an apple
banana
that is a peach

则运行上述命令 awk '{print $0}' text.txt就会原样打印出来。 awk会默认根据空格和制表符,将每一行分成若干字段,$1,$2,$3代表分割后的第一个字段,第二个字段和第三个字段。

举例,echo 'this is a test' | awk '{print $1,$2}' 就会输出this is。如果想要以特定字符分割字符串,需要加选项,echo 'this:is:a:test' |awk -F ':' '{print $1,$2}' 这个-F '分隔符'就会按照指定的分隔符对一行文本进行分割,输出结果同上。

变量

awk除了$+数字以外,还有很多内置变量。

  1. NR: 表示当前处理的是第几行
  2. NF: 表示当前行有多少字段
  3. FILENAME:当前文件名
  4. FS:字段分隔符,默认是空格和制表符。
  5. RS:行分隔符,用于分割每一行,默认是换行符。
  6. OFS:输出字段的分隔符,用于打印时分隔字段,默认为空格。
  7. ORS:输出记录的分隔符,用于打印时分隔记录,默认为换行符。
  8. OFMT:数字输出的格式,默认为%.6g。

函数

awk也有很多内置函数,示例:awk -F ':' '{ print toupper($1) }' test.txt

  1. tolower():字符转为小写。
  2. length():返回字符串长度。
  3. substr():返回子字符串。
  4. sin():正弦。
  5. cos():余弦。
  6. sqrt():平方根。
  7. rand():随机数。

条件

#格式
awk 条件 命令 文件名
#示例 以:为分隔符,第一个字段==root的时候,打印第一个字段
awk -F ':' '$1 == "root" {print $1}' demo.txt

awk可以使用正则表达式作为匹配模式。例如,打印所有以 A 开头的行:

awk '/^A/ {print}' test.txt

BEGIN 和 END 块 BEGIN:在处理任何输入行之前执行。 END:在处理完所有输入行之后执行。

#示例:开始时输出指定字段,结束时输出行数
awk 'BEGIN {print "Name List"} {print $1} END {print "Total:", NR-1}' data.txt

if语句

awk -F ':' '{if ($1 > "m") print $1}' test.txt

解释:找到所有第一个字段值>"m"的所有行,并输出这些行的第一个字段值。

for语句

awk '{names[$1]++} END {for (name in names) print name, names[name]}' data.txt

数组使用和构建:names[$1]++:这行代码是在构建一个名为 names 的关联数组。数组的键是 $1(即每行的第一列,这里是人名),每次遇到同一个名字时,都会将对应的值增加 1。这种用法非常适合于计数场景,比如这里用来统计每个名字出现的次数。 循环遍历: for (name in names):这个循环会遍历 names 数组的所有键(即这里的名字),每个键都会在循环中被处理一次。 输出: print name, names[name]:对于数组中的每个键(即每个名字),这条命令都会打印出名字和对应的计数(即这个名字在文本中出现的次数)。

总结

本文介绍了awk命令的一些常用用法,能够方便我们今后在linux中更快捷地处理文本文件,当然还有很多条件没有介绍到的,这个小伙伴们在今后的工作和学习中如果需要的话,可以现学现卖,哈哈哈。 欢迎大家关注晴天码字,也欢迎大家加我微信,一起探讨和学习。我们下期见~~

本文由mdnice多平台发布