Linux 文本编辑三剑客之 awk
Linux 文本处理三剑客是面试和后端工作中较为常见的。需要掌握:
- grep:文本过滤、筛选
- sed:文本编辑加工
- awk:文本格式化输出
文章只列举常用的,不会完全把手册复述一遍
本节内容基于正则表达式:
正则表达式
借助正则表达式可以快速匹配、过滤需要的字符串,在 Linux 上处理大量文本比较高效。
- 一次处理一行
- Linux 上只有文本处理工具三剑客(grep、sed、awk)常用,编程语言都有对应支持
- 扩展正则是基本正则的补充,一般结合三剑客使用建议直接使用扩展正则的写法,简洁
基本正则
符号 | 作用 |
---|---|
^ |
模式匹配最左侧,^abc 就是以abc开头 |
$ |
模式匹配最右侧,abc$ 就是以abc结尾 |
^$ |
组合符。空行 |
. |
任意一个且只有一个字符,不匹配空行 |
* |
匹配前一个字符0或多次,不单独使用 |
.* |
组合符。匹配任意多个字符 |
^.* |
组合符。匹配任意多个字符开头 |
.*$ |
组合符。匹配任意多个字符结尾 |
\ |
特殊字符还原本意,\. 是小数点 |
[abc] |
匹配集合内任意字符 |
[^abc] |
匹配集合之外的字符 |
<> |
定位单词的左侧和右侧。<deltaqin> 可以找出 deltaqin nb 找不出deltaqinnb |
扩展正则
符号 | 作用 |
---|---|
+ |
匹配前面字符一次或多次 |
[:@]+ |
组合符。匹配[]内的字符一次或多次 |
? |
匹配前面字符0次或1次 |
` | ` |
() |
分组过滤,括号内是一个整体 |
a{m,n} |
前面的字符最少m最多n次 |
a{m,} |
前面的字符最少m次 |
a{m} |
前面的字符m次 |
a{,m} |
前面的字符最多m次 |
具体使用还是要结合三剑客一起
Why awk
按行对文本复杂格式化处理,简单使用 grep
或者 sed
就可以,自定义要求高就使用 awk
。更像是一门编程语言,支持判断、数组、循环等等。
What awk
awk [option] '[pattern]{action}' file
# awk 'BEGIN{action} pattern{action} END{action}' file
- option:可选参数
-F
指定分隔符,默认空格分割-v
定义或修改一个awk内部变量
- pattern:可以是普通文本字符,也可以是正则表达式
BEGAIN
处理文本前要执行的操作END
处理文本之后执行的操作- 使用
内置变量 + 关系运算符
,限制输出内容,例如NR>3
、NR!=3
、/正则/
、!/正则/
不匹配正则、/正则/、/正则/
范围,条件&&条件
- action:对文本执行的操作
- print 自带换行符,
- printf 是没有换行符的。printf需要指定每一个item的输出格式,格式都是
%
开头,和C语言基本一致,默认右对齐,-
变为左对齐
- 内置变量:
- 行列:
$0
整行;NF
分割完最后一列;(NF-1)
分割完倒数第二列;NR
当前行号;FNR
各文件分别计数的行号 - 分隔符:
FS
字段输入分隔符,默认空格;OFS
字段输出分隔符,默认空格; - 换行符:
RS
输入换行符,替代回车;ORS
输出换行符,替代回车 - 其余变量:
FILENAME
文件名;ARGC
命令行参数个数;ARGV
命令行参数构成的数组;
- 行列:
注意:
必须外层单引号,内层双引号。
How awk
使用简单内置变量打印内容
输出内容之间加上,
否则没有空格
自定义输出的内容:
多个文件的行号分开打印:FNR
打印匹配模式的内容
awk '[pattern]{action}' file
打印第5行:
打印第5行第一列:
打印第5-7行第一列:
行号 NR
number of row
列数NF
number of field
指定输入/输出分隔符
FS 输入分隔符
OFS 输出分隔符
参数打印
自定义变量
全局变量
局部变量
shell变量
printf 格式化输出
模式使用
指定了条件模式,只有匹配模式的才会执行action
正则条件模式使用
范围匹配:
常见使用案例
查询系统禁止登录的用户
统计日志访客IP数量
sort -n
sort 默认从小到大排序,-n
逆序
wc -l
统计行数
访问频繁IP top3
打印所有非系统建立用户的用户名和家目录
删除文件空白行写到新文件
显示第三列是211的行
$3~
指定针对第三列正则匹配