版权声明:本文为博主hanchao5272原创文章,转载请注明来源,并留下原文链接地址,谢谢! https://blog.csdn.net/hanchao5272/article/details/89205901
系列目录与参考文献传送门: shell入门学习笔记-序章
awk IO操作
语句 | 描述 |
---|---|
getline | 获取下一行输入作为$0的值 |
getline var | 获取下一行输入作为var的值 |
command getline [var] | 运行命令管道输出到$0或var |
next | 停止当前处理的输入记录 |
system(cmd-line) | 执行命令和返回状态 |
打印当前记录 | |
print … >> file | 追加输出到文件 |
print … | command | 打印输出作为命令输入 |
printf fmt, expr-list [>file] | 格式化输出和写到文件 |
获取下一行输入给$0 (getline)
[worker@c2-a02-126-10-4 hanchao]$ seq 5 |awk '/3/{print}'
3
[worker@c2-a02-126-10-4 hanchao]$ seq 5 |awk '/3/{getline;print}'
4
获取下一行输入给var (getline var)
# 简单实用
[worker@c2-a02-126-10-4 hanchao]$ seq 5 |awk '/3/{getline a;print a}'
4
# 合并文件列
[worker@c2-a02-126-10-4 hanchao]$ cat a.txt
a
b
c
[worker@c2-a02-126-10-4 hanchao]$ cat b.txt
1
2
3
[worker@c2-a02-126-10-4 hanchao]$ awk '{print $0}' b.txt
1
2
3
[worker@c2-a02-126-10-4 hanchao]$ awk '{line < "a.txt";print $0,line}' b.txt
1
2
3
[worker@c2-a02-126-10-4 hanchao]$ awk '{getline line < "a.txt";print $0,line}' b.txt
1 a
2 b
3 c
运行命令管道输出到$0或var (command getline [var])
[worker@c2-a02-126-10-4 hanchao]$ awk 'BEGIN{"echo hhhh"|getline line;print line"--"}'
hhhh--
跳过处理本行next
# 处理当前行
[worker@c2-a02-126-10-4 hanchao]$ seq 5 |awk '{if(NR==3){print "=="$0"==";}else{print}}'
1
2
==3==
4
5
# 跳过当前行,处理下一行
[worker@c2-a02-126-10-4 hanchao]$ seq 5 |awk '{if(NR==3){getline;print "=="$0"==";}else{print}}'
1
2
==4==
5
# 跳过当前行
[worker@c2-a02-126-10-4 hanchao]$ seq 5 |awk '{if(NR==3){next;print "=="$0"==";}else{print}}'
1
2
4
5
系统命令运行结果system()
[worker@c2-a02-126-10-4 hanchao]$ awk 'BEGIN{if(system("echo 1")==0) print "yes";else print "no"}'
1
yes
追加输出至文件print … >> file
[worker@c2-a02-126-10-4 hanchao]$ seq 5 |awk '{print > "file.txt"}'
[worker@c2-a02-126-10-4 hanchao]$ cat file.txt
1
2
3
4
5
打印输出作为管道输入print …|commond
[worker@c2-a02-126-10-4 hanchao]$ seq 5 |awk '{print |"grep 3"}'
3
格式化输出printf fmt, expr-list [>file]
Format | 描述 |
---|---|
\n |
换行 |
\t,\v |
水平制表符,垂直制表符 |
\b |
退格符 |
\r |
回车符 |
\f |
换页符 |
%c |
单个字符 |
%s |
一个字符串 |
%.ns |
输出字符串,n是输出几个字符 |
%d,%i |
一个整数 |
%e,%E |
科学计数法 |
%f,%g,%G |
一个浮点数 |
%m.nf |
输出浮点数,m是输出整数位数,n是输出的小数位数 |
%o |
八进制 |
%u |
十进制 |
%x,%X |
十六进制,使用a/A至f/F表示10到15 |
%% |
输出单个% |
%-5s |
左对齐,对参数每个字段左对齐,宽度为5 |
%-4.2f |
左对齐,宽度为4,保留两位小数 |
%5s |
右对齐,不加横线表示右对齐 |
换行\n
[worker@c2-a02-126-10-4 hanchao]$ awk 'BEGIN{printf "Hello\nworld\n"}'
[worker@c2-a02-126-10-4 hanchao]$ awk 'BEGIN{print "Hello\nworld\n"}'
Hello
world
[worker@c2-a02-126-10-4 hanchao]$ awk 'BEGIN{printf "Hello\nworld\n"}'
Hello
world
[worker@c2-a02-126-10-4 hanchao]$
水平制表符\t、垂直制表符\v
[worker@c2-a02-126-10-4 hanchao]$ awk 'BEGIN{printf "ID\tName\tAddress\n111\tJone\t18\n2\tSmith\t33\n"}'
ID Name Address
111 Jone 18
2 Smith 33
[worker@c2-a02-126-10-4 hanchao]$ awk 'BEGIN{printf "ID\vJone\v33\n"}'
ID
Jone
33
退格符\b
# 退格:最后一个字符被删除
[worker@c2-a02-126-10-4 hanchao]$ awk 'BEGIN{printf "12345\b 12345\n"}'
1234 12345
回车符\r
# 回车:回车之后的内容覆盖回车之前的内容
[worker@c2-a02-126-10-4 hanchao]$ awk 'BEGIN{printf "54321\r12345\n"}'
12345
换页符\f
[worker@c2-a02-126-10-4 hanchao]$ awk 'BEGIN{printf "ID\fJone\f33\n"}'
ID
Jone
33
%c字符
[worker@c2-a02-126-10-4 hanchao]$ awk 'BEGIN{printf "%c,%c\n",65,"hello"}'
A,h
- 数值会进行ASCII码转换得到对应的字符。
- 字符串会截取第一个字符。
%s,%.ns字符串
## %s
# 一个字符串
[worker@c2-a02-126-10-4 hanchao]$ awk 'BEGIN{printf "%s\n","hello"}'
hello
# 将换行符替换成逗号
[worker@c2-a02-126-10-4 hanchao]$ seq 5 |awk '{if(NR!=5){printf "%s,",$0}else{print}}'
1,2,3,4,5
# 输出一个字符
[worker@c2-a02-126-10-4 hanchao]$ awk 'BEGIN{printf "%.1s\n","hello"}'
h
%d,%i整数
[worker@c2-a02-126-10-4 hanchao]$ awk 'BEGIN{printf "%d %i\n",11.22,33.44}'
11 33
%e,%E科学计数法
[worker@c2-a02-126-10-4 hanchao]$ awk 'BEGIN{printf "%e %E\n",11.22,33.44}'
1.122000e+01 3.344000E+01
[worker@c2-a02-126-10-4 hanchao]$ awk 'BEGIN{printf "%.1e %.3E\n",11.22,33.44}'
1.1e+01 3.344E+01
%f,%g,%G,%m.nf浮点数
[worker@c2-a02-126-10-4 hanchao]$ awk 'BEGIN{printf "%f %.2f\n",11.22,33.44}'
11.220000 33.44
# %g和%G会自动删除对数值无意义的0
[worker@c2-a02-126-10-4 hanchao]$ awk 'BEGIN{printf "%f %g %G\n",11.22,33.44,44.5500}'
11.220000 33.44 44.55
# %m.nf: m表示整数长度,n表示小数点长度
[worker@c2-a02-126-10-4 hanchao]$ awk 'BEGIN{printf "%f %1.2f %3.1f\n",11.22,33.44,44.5500}'
11.220000 33.44 44.5
%o八进制,%u十进制,%x十六进制
[worker@c2-a02-126-10-4 hanchao]$ awk 'BEGIN{printf "十进制=%u,八进制=%o,十六进制=%X\n",1001,1001,1001}'
十进制=1001,八进制=1751,十六进制=3E9
[worker@c2-a02-126-10-4 hanchao]$ awk 'BEGIN{printf "十进制=%u,八进制=%o,十六进制=%x\n",1001,1001,1001}'
十进制=1001,八进制=1751,十六进制=3e9
%%输出百分号
[worker@c2-a02-126-10-4 hanchao]$ awk 'BEGIN{printf "33.19%%\n" }'
33.19%
%-ns,%ns,%m.ns对齐方式
%ns
: 右对齐,宽度为n%-ns
:左对齐,宽度为n%m.ns
: 右对齐,整数部分宽度为m,小数部分宽度为n
[worker@c2-a02-126-10-4 hanchao]$ printf "T001 David 98.912\nT02 Jone 100\n" |awk 'BEGIN{printf "%-5s\t%-8s\t%-3s\n","ID","Name","Score"}{printf "%-5s\t%-8s\t%-3.2f\n",$1,$2,$3}'
ID Name Score
T001 David 98.91
T02 Jone 100.00