shell入门学习笔记-15-命令详解: 三剑客之一awk-IO操作

版权声明:本文为博主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 打印当前记录
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

猜你喜欢

转载自blog.csdn.net/hanchao5272/article/details/89205901