awk
提供了一种灵活的方式来处理文本文件,可以用于数据提取、数据转换、报告生成等任务。
Linux文本处理三剑客:
- awk
- sed
- grep
一、基本语法
awk '模式 { 动作 }' 要处理的文件
二、工作原理
-
awk
逐行扫描文件,将每一行视为一个记录(record)。 - 用户可以定义一个模式(pattern),当某一行满足该模式时,执行对应的动作(action)。
- 动作可以是打印、计算、格式化输出等操作。
三、常用功能
字段分隔符:默认情况下,
awk
使用空格作为字段分隔符,但可以通过-F
参数指定其他分隔符。例如,awk -F',' '{print $1}' filename
使用逗号作为字段分隔符。内置变量:
-
$0
:所有字段。 -
$1
,$2
, ...:第一个字段、第二个字段,以此类推。 -
NF
:字段数。 -
NR
:当前行号。 -
FS
:字段分隔符。 -
OFS
:输出字段分隔符。
-
条件匹配:可以使用条件表达式进行匹配,例如
/pattern/ { action }
。循环:
awk
支持for
、while
循环,可以在动作部分使用。内置函数:
awk
提供了许多内置函数,如数学函数、字符串函数等,可以在动作部分使用。输出格式化:可以使用
printf
函数对输出进行格式化。
四、简单示例
1. 筛选列
示例文本如下:
Alice 25
Bob 30
Charlie 28
David 22
输出指定列
第一列,姓名
#命令 awk '{print $1}' data.txt #输出 Alice Bob Charlie David
第二列,年龄
#命令 awk '{print $2}' data.txt #输出 25 30 28 22
2. 计算数据
假设有一个包含数字的文件 numbers.txt
,内容如下:
10
20
30
40
计算所有数字的总和:
#命令
awk '{sum += $1} END {print sum}' numbers.txt
#输出
100
3. 条件匹配的行
假设有一个包含学生成绩的文件 grades.txt
,内容如下:
Alice 85
Bob 70
Charlie 92
David 65
打印成绩大于等于80分的学生:
#命令
awk '$2 >= 80 {print $1, $2}' grades.txt
#输出
Alice 85
Charlie 92
4. 自定义分隔符
假设有一个以逗号分隔的数据文件 data.csv
,内容如下:
Alice,25
Bob,30
Charlie,28
David,22
使用逗号作为分隔符打印第二列:
#命令
awk -F',' '{print $2}' data.csv
#输出
25
30
28
22
5. 格式化输出
假设有一个包含学生成绩的文件 grades.txt
,内容如下:
Alice 85
Bob 70
Charlie 92
David 65
格式化输出姓名和成绩:
#命令
awk '{printf "Name: %-10s Grade: %d\n", $1, $2}' grades.txt
#输出
Name: Alice Grade: 85
Name: Bob Grade: 70
Name: Charlie Grade: 92
Name: David Grade: 65
这些示例展示了 awk
命令在处理文本文件时的一些常见用法。根据具体的需求,你可以根据这些示例进行调整和扩展。
五、复杂示例
用awk命令把目录的权限、属组、link
提出来看一下:
$ ll /var | awk '{printf "%-10s %-8s ", $1, $4; for (i=9; i<=NF; i++) printf "%s ", $i; print ""}'
总计
drwxr-xr-x root ./
drwxr-xr-x root ../
drwxr-xr-x root backups/
drwxr-xr-x root cache/
drwxrwsrwt whoopsie crash/
drwxr-xr-x root dsm/
drwxr-xr-x root lib/
drwxrwsr-x staff local/
lrwxrwxrwx root lock -> /run/lock/
drwxrwxr-x syslog log/
drwxrwsr-x mail mail/
drwxrwsrwt whoopsie metrics/
drwxr-xr-x root opt/
lrwxrwxrwx root run -> /run/
drwxr-xr-x root snap/
drwxr-xr-x root spool/
drwxrwxrwt root tmp/
当然这意义不大,还复杂。
六、可以做到哪些
文本处理:
- 提取数据:可以从文本文件中提取特定字段、行或数据。
- 格式化输出:可以根据需要对数据进行格式化输出,包括对齐、填充等。
- 搜索和替换:可以搜索文本文件中的特定模式,并进行替换或其他操作。
数据处理:
- 计算:可以对数据进行数学运算,如求和、平均值等。
- 统计:可以统计数据文件中的行数、字段数,或者根据条件进行统计。
- 过滤和排序:可以根据条件过滤数据,或者对数据进行排序操作。
报告生成:
- 生成报告:可以根据数据生成报告、摘要或汇总信息。
- 格式化输出:可以将数据以特定格式输出,适用于生成报表或日志文件。
数据转换:
- 字段分割:可以根据指定的分隔符对数据进行分割和处理。
- 数据转换:可以将数据从一种格式转换为另一种格式。
条件匹配:
- 根据条件处理数据:可以根据条件匹配特定行或字段,并执行相应的操作。
自定义功能:
- 自定义函数:可以在
awk
脚本中定义和使用自定义函数,增强灵活性和功能性。 - 数组操作:支持数组操作,可以用于更复杂的数据处理任务。
- 自定义函数:可以在
灵活性和扩展性:
-
awk
提供了丰富的内置函数和变量,以及灵活的语法,使其非常适合处理各种文本和数据处理任务。 - 可以结合其他 Unix 工具和管道操作,实现更复杂的数据处理流程。
-
七、怎么做
- 模式组合:可以使用逻辑运算符组合多个模式。
- 自定义函数:可以在
awk
脚本中定义和调用自定义函数。 - 数组操作:
awk
支持数组操作,可以用于更复杂的数据处理。
本文共 1075 个字数,平均阅读时长 ≈ 3分钟
评论 (0)