awk
是一个强大的文本分析工具,主要用于模式扫描和文本/数据提取。它是 UNIX/Linux 系统中的标准工具之一,用于处理文本文件和字符串。
awk 'pattern { action }' file
其中:
pattern
是你要匹配的模式或条件。action
是当模式匹配时要执行的命令或操作。file
是你要处理的文件或输入源。$0
来表示整行内容。awk '{ print }' file
示例:打印文件中的所有行。
2. 打印字段:使用 $n
来表示第 n
个字段。默认字段分隔符是空格。
awk '{ print $1, $3 }' file
示例:打印文件中每行的第一个和第三个字段。
lsof -i :8080 | awk 'NR>1 {print $2}'
这里展示了使用awk命令来处理lsof的输出,并只打印出第二列的内容,即PID。在awk中,NR是一个特殊的变量,代表当前处理的记录号(通常是行号)。NR>1表示选择除第一行之外的所有行。这是因为第一行通常是标题行或列名,通常会排除它。
3. 变量:你可以在 awk
中定义和使用变量。
awk '{ total += $1 } END { print total }' file
示例:计算文件中第一列的总和并在结束时打印出来。
4. 条件语句:使用 if
、else
和 while
等。
awk 'BEGIN { print "Start" } $1 > 10 { print "Number is greater than 10" } END { print "End" }' file
示例:如果第一列的值大于10,则打印一条消息。在开始和结束时打印其他消息。
for
循环遍历数组或文件中的行。awk '{ for(i=1; i<=NF; i++) print $i }' file
示例:遍历每一行的每个字段并打印它们。
length()
、split()
等。awk '{ print length($0), split($1, arr) }' file
示例:打印每行的长度和第一个字段中的单词数量。
7. 正则表达式:可以用来匹配和搜索文本。
awk '/pattern/ { print }' file
示例:打印包含特定模式的行。
8. 文件操作:例如,读取文件、写入文件等。
awk 'BEGIN { print "Hello World" > "newfile" }' file
示例:创建一个新文件并写入“Hello World”。
9. 数组:可以存储和处理数据结构。
awk '{ arr[$1]++ } END { for(i in arr) print i, arr[i] }' file
示例:统计文件中每个唯一值的出现次数。
10. 用户自定义函数:可以定义自己的函数来扩展 awk
的功能。例如,定义一个函数来计算两个数的和:
awk 'function add(x, y) { return x + y } { print add($1, $2) }' file
+
、-
、*
、/
、%
、&&
、||
等。例如,计算两个数的和与差:awk '{ print $1 + $2, $1 - $2 }' file
awk '{ a = $1; b = $3 } END { print a, b }' file
示例:在处理完所有行后打印第一列和第三列的值。
13. 多文件处理:可以同时处理多个文件。例如,打印两个文件中第一列的和:
awk '{ sum += $1 } END { print sum }' file1 file2
示例:计算两个文件中第一列的总和。