shell基础-awk
awk
是一个强大的文本处理工具,广泛用于 Unix 和 Linux 系统中。它可以用来处理和分析文本文件,特别是那些包含结构化数据的文件。以下是 awk
的基础知识和一些常用示例。
基本概念
-
记录和字段:
- 记录:
awk
处理的每一行文本称为一条记录。 - 字段:每条记录中的列称为字段。默认情况下,字段由空格或制表符分隔。
- 记录:
-
内置变量:
NR
:当前记录的行号。NF
:当前记录中的字段数。FS
:字段分隔符,默认为空格或制表符。OFS
:输出字段分隔符,默认为空格。ORS
:输出记录分隔符,默认为换行符。RS
:记录分隔符,默认为换行符。$0
:当前记录的全部内容。$n
:当前记录的第 n 个字段。
-
模式和动作:
- 模式:定义了何时执行某些操作的条件。
- 动作:在满足模式条件时执行的一系列命令,用
{}
包围。
基本语法
awk 'pattern { action }' file
常用示例
1. 打印文件的每一行
awk '{ print $0 }' file.txt
2. 打印文件的第二列
awk '{ print $2 }' file.txt
3. 打印文件中所有包含特定字符串的行
awk '/pattern/ { print $0 }' file.txt
4. 打印文件中第一列和第三列
awk '{ print $1, $3 }' file.txt
5. 使用自定义字段分隔符
awk -F',' '{ print $1, $2 }' file.csv
6. 计算文件中某列的总和
awk '{ sum += $1 } END { print "Sum:", sum }' file.txt
7. 计算文件中某列的平均值
awk '{ sum += $1; count++ } END { print "Average:", sum/count }' file.txt
8. 根据条件过滤行
awk '$1 > 10 { print $0 }' file.txt
9. 使用 BEGIN 和 END 块
awk 'BEGIN { print "Start of processing" } { print $0 } END { print "End of processing" }' file.txt
实际应用
假设有一个文件 data.txt
,内容如下:
Alice 30
Bob 25
Charlie 35
David 28
1. 打印所有人的名字
awk '{ print $1 }' data.txt
输出:
Alice
Bob
Charlie
David
2. 打印年龄大于 25 的人
awk '$2 > 25 { print $0 }' data.txt
输出:
Alice 30
Charlie 35
David 28
3. 计算所有人的平均年龄
awk '{ sum += $2; count++ } END { print "Average age:", sum/count }' data.txt
输出:
Average age: 29.5
进阶用法
1. 使用数组
awk '
{
count[$1]++
}
END {
for (name in count) {
print name, count[name]
}
}
' data.txt
输出:
Alice 1
Bob 1
Charlie 1
David 1
2. 多文件处理
awk '
{
total += $2
}
END {
print "Total age across all files:", total
}
' file1.txt file2.txt
总结
awk
是一个非常强大的文本处理工具,适用于各种文本分析任务。通过理解其基本概念和常用语法,你可以高效地处理和分析数据。