awk 截取部分字符串_干货-Shell编程文本处理三剑客之-awk

awk

在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复杂的文本操作,被广泛应用于 Shell 脚本,完成各种自动化配置任务。

AWK是一种处理文本文件的语言,是一个强大的文本分析工具。之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。

语法格式:

25fce9aa0409ce5dd06d557f6eefe05b.png

语法格式解释:

语法格式 含义
BEGIN{} 正式处理数据之前执行
pattern 匹配模式
{commands} 处理命令,可能多行
END{} 处理完所有匹配数据后执行

awk内置变量

内置变量 含义
$0 整行内容
$1~$n 当前行的第1-n个字段
NF 当前行的字段个数,也就是有多少列
NR 当前行的行号,从1开始计数
FNR 多文件处理时,每个文件行号单独计数都是从0开始
FS 输入字段分隔符,不指定则默认以空格或tab键分隔
RS 输入行分隔符,默认回车换行
OFS 输出字段分隔符,默认为空格
ORS 输出行分隔符,默认回车换行
FILENAME 当前输入的文件名字
ARGC 命令行参数个数
ARGV 命令行参数数组

示例

以下所有示例文件为/etc/passwd,请将其拷贝一份使用

# 打印整行内容
awk '{print $0}' passwd

# 使用":"号作为分隔符,输出第一个字段
awk 'BEGIN{FS=":"}{print $1}' passwd
->root
->bin
->daemon
->adm
->lp
->sync
->shutdown
->...

# 输出行号
awk '{print NR}' passwd

# 多个文件行号单独计数
awk '{print FNR}' passwd file2

# 指定行分隔符
echo "hello-world-hello-linux-hello-java" | awk 'BEGIN{RS="-"}{print $0}'
->hello
->world
->hello
->linux
->hello
->java
->

# 指定输出字段分隔符
awk 'BEGIN{FS=":";OFS=":"}{print NR,$1}' passwd
->1:root
->2:bin
->3:daemon
->4:adm
->5:lp
->...

printf格式化输出

格式符 含义
%s 打印字符串
%d 打印十进制数
%f 打印一个浮点数
%x 打印十六进制数
%o 打印八进制数
%e 打印数字的科学计数法形式
%c 打印单个字符的ASCII码
- 左对齐
+ 右对齐
# 显示8进制在前面加0,显示16进制在前面加0x

示例

# 以字符串格式打印第1个字段,以":"作为分隔符
awk 'BEGIN{FS=":"}{printf "%st",$1}' passwd
->root  bin daemon  adm lp ...

# 以字符串格式打印第1个字段和对应行号,输出格式为"行号:字段内容"
awk 'BEGIN{FS=":"}{printf "%d:%sn",NR,$1}' passwd
->1:root
->2:bin
->3:daemon
->4:adm
->5:lp
->...

# 左对齐
# 在不指定位数的情况下默认左对齐,指定位数后为右对齐(必须指定位数)
awk 'BEGIN{FS=":"}{printf "%10d:%sn",NR,$1}' passwd
->         1:root
->         2:bin
->         3:daemon
->         4:adm
->         5:lp
->...

awk 'BEGIN{FS=":"}{printf "%-10d:%sn",NR,$1}' passwd
->1         :root
->2         :bin
->3         :daemon
->4         :adm
->5         :lp
->...

两种匹配模式

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值