Bash 编程每日总结:高项必备的高效技巧,你知道几个?

85 阅读2分钟

Shell 编程

编写 awk 脚本统计单词数

我来尝试用 awk 写几个脚本。 试着写一个简单的命令:

awk '{print "第" NR "行有" NF "个单词"}' filename.txt

嗯,NF 是 awk 中表示当前行字段数的变量,也就是单词数。NR 是记录号,表示当前是第几行。我觉得这个命令应该能输出每行的单词数。 让我测试一下。假设 filename.txt 内容如下:

Hello world
This is a test

运行命令后,应该得到: image.png 看起来不错,这个脚本应该没问题。

接下来,我想提取一个日志文件中特定字段的信息。假设日志文件的格式是这样的:

2023-10-01 12:00:00 INFO User logged in
2023-10-01 12:01:00 ERROR Failed to connect
2023-10-01 12:02:00 WARNING Disk space low

我想提取出时间戳和日志级别。时间戳是前 19 个字符,日志级别是第 20 到第 24 个字符。我可以用 substr 函数来提取。 我试着写一个命令:

awk '{timestamp = substr($0, 1, 19); level = substr($0, 20, 5); print timestamp " " level}' log.txt

这里,substr(0,1,19)提取从第1个字符开始的19个字符,substr(0, 1, 19) 提取从第 1 个字符开始的 19 个字符,substr(0, 20, 5) 提取从第 20 个字符开始的 5 个字符。然后用 print 输出它们。 测试一下,假设 log.txt 内容如上,运行命令后应该得到:

image.png 看起来也挺好的,这个脚本应该也能正常工作。 最后,我想计算一个数据文件中某列的平均值。假设数据文件是这样的: 复制

John 25
Alice 30
Bob 22

我想计算年龄的平均值。我记得 awk 可以用 sum 和 count 来累加和计数,然后用 END 块来计算平均值。 我试着写一个命令: bash

awk '{sum += $2; count++} END {print "平均年龄是" sum/count}' data.txt

image.png 这里,sum += $2 累加第二列的值,count++ 计数行数。在 END 块中,计算 sum/count 得到平均值。 测试一下,假设 data.txt 内容如上,运行命令后应该得到:

平均年龄是 25.6667 嗯,结果看起来有点..,我可以用 printf 来格式化输出,保留两位小数。

修改后的命令:

awk '{sum += $2; count++} END {printf "平均年龄是%.2f\n", sum/count}' data.txt

再次测试,应该得到: 平均年龄是 25.67