高级输出

print语句可用于快速而简单的输出。若要严格按照所想的格式化输出,则需要使用printf语句

printf 几乎可以产生任何形式的输出,但在本节中,仅展示其部分功能。

自定义输出格式

printf 语句的形式如下:

#  和Golang的prinf一样的用法

printf(format, value1, value2, ..., valuen)  

# 第一个规格说明如何打印 value1 ,第二个说明如何打印 value2 ,... 。因此,有多少 value 要打印,在 format 中就要有多少个 % 规格。

其中 format 是字符串,包含要逐字打印的文本, format 之后的每个值该如何打印的规格用%定义。一个规格是一个 % 符,%后面跟着一些字符,用来控制一个 value 的格式。

printf 不会自动产生空格或者新的行,必须必须自己来创建,所以不要忘了 \n

排序输出

最简单的方式是使用awk将需要排序的字段放在每一行记录的最前面,然后利用一个排序程序来处理awk的输出:

awk '{ printf("%6.2f    %s\n", $2 * $3, $0) }' emp.data | sort

# 将awk的输出通过管道传给 sort 命令

按照第二和第三字段的乘积进行排序。

拆分文件

awk拆分文件很简单,使用重定向就好了。下面这个例子,是按第6例分隔文件,相当的简单(其中的NR!=1表示不处理表头)。

awk 'NR!=1{print > $6}' netstat.txt

ls
$ ls
ESTABLISHED  FIN_WAIT1  FIN_WAIT2  LAST_ACK  LISTEN  netstat.txt  TIME_WAIT

$ cat ESTABLISHED
tcp        0      0 coolshell.cn:80        110.194.134.189:1032        ESTABLISHED
tcp        0      0 coolshell.cn:80        123.169.124.111:49809       ESTABLISHED
tcp        0      0 coolshell.cn:80        123.169.124.111:49829       ESTABLISHED
tcp        0   4166 coolshell.cn:80        61.148.242.38:30901         ESTABLISHED
tcp        0      0 coolshell.cn:80        110.194.134.189:4796        ESTABLISHED
tcp        0      0 coolshell.cn:80        123.169.124.111:49840       ESTABLISHED

$ cat FIN_WAIT1
tcp        0      1 coolshell.cn:80        124.152.181.209:26825       FIN_WAIT1

$ cat FIN_WAIT2
tcp        0      0 coolshell.cn:80        61.140.101.185:37538        FIN_WAIT2
tcp        0      0 coolshell.cn:80        116.234.127.77:11502        FIN_WAIT2
tcp        0      0 coolshell.cn:80        117.136.20.85:50025         FIN_WAIT2

$ cat LAST_ACK
tcp        0      1 coolshell.cn:80        208.115.113.92:50601        LAST_ACK

$ cat LISTEN
tcp        0      0 0.0.0.0:3306           0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:80             0.0.0.0:*                   LISTEN
tcp        0      0 127.0.0.1:9000         0.0.0.0:*                   LISTEN
tcp        0      0 :::22                  :::*                        LISTEN

$ cat TIME_WAIT
tcp        0      0 coolshell.cn:80        124.205.5.146:18245         TIME_WAIT
tcp        0      0 coolshell.cn:80        183.60.215.36:36970         TIME_WAIT
tcp        0      0 coolshell.cn:80        183.60.212.163:51082        TIME_WAIT

也可以把指定的列输出到文件:

awk 'NR!=1{print $4,$5 > $6}' netstat.txt

再复杂一点:(注意其中的if-else-if语句,可见awk其实是个脚本解释器)

$ awk 'NR!=1{if($6 ~ /TIME|ESTABLISHED/) print > "1.txt";
else if($6 ~ /LISTEN/) print > "2.txt";
else print > "3.txt" }' netstat.txt

  $ ls ?.txt
  1.txt  2.txt  3.txt

  $ cat 1.txt
  tcp        0      0 coolshell.cn:80        124.205.5.146:18245         TIME_WAIT
  tcp        0      0 coolshell.cn:80        110.194.134.189:1032        ESTABLISHED
  tcp        0      0 coolshell.cn:80        123.169.124.111:49809       ESTABLISHED
  tcp        0      0 coolshell.cn:80        123.169.124.111:49829       ESTABLISHED
  tcp        0      0 coolshell.cn:80        183.60.215.36:36970         TIME_WAIT
  tcp        0   4166 coolshell.cn:80        61.148.242.38:30901         ESTABLISHED
  tcp        0      0 coolshell.cn:80        110.194.134.189:4796        ESTABLISHED
  tcp        0      0 coolshell.cn:80        183.60.212.163:51082        TIME_WAIT
  tcp        0      0 coolshell.cn:80        123.169.124.111:49840       ESTABLISHED

  $ cat 2.txt
  tcp        0      0 0.0.0.0:3306           0.0.0.0:*                   LISTEN
  tcp        0      0 0.0.0.0:80             0.0.0.0:*                   LISTEN
  tcp        0      0 127.0.0.1:9000         0.0.0.0:*                   LISTEN
  tcp        0      0 :::22                  :::*                        LISTEN

  $ cat 3.txt
  tcp        0      0 coolshell.cn:80        61.140.101.185:37538        FIN_WAIT2
  tcp        0      0 coolshell.cn:80        116.234.127.77:11502        FIN_WAIT2
  tcp        0      1 coolshell.cn:80        124.152.181.209:26825       FIN_WAIT1
  tcp        0      1 coolshell.cn:80        208.115.113.92:50601        LAST_ACK
  tcp        0      0 coolshell.cn:80        117.136.20.85:50025         FIN_WAIT2

环境变量

怎么和环境变量交互:(使用-v参数和ENVIRON,使用ENVIRON的环境变量需要export)

$ x=5
$ y=10
$ export y
$ echo $x $y
5 10

$ awk -v val=$x '{print $1, $2, $3, $4+val, $5+ENVIRON["y"]}' OFS="\t" score.txt
Marry   2143    78      89      87
Jack    2321    66      83      55
Tom     2122    48      82      81
Mike    2537    87      102     105
Bob     2415    40      62      72

最后更新于

这有帮助吗?