Shell 以逆序形式打印行,可以用来在 Bash 中模拟栈结构。最简单的实现方法是使用tac
命令。当然也可以用awk
来搞定。
实战演练
先来试试tac
。
(1) 该命令的语法如下:
tac file1 file2 ...
它也可以从stdin
中读取输入:
$ seq 5 | tac
5
4
3
2
1
tac
命令默认使用\n
作为行分隔符。但我们也可以用选项-s
指定其他分隔符。
$ echo "1,2" | tac-s,
2
1
(2) 使用awk
的实现方式如下:
seq 9 | \
awk '{ lifo[NR]=$0 } \
END { for(lno=NR;lno>-1;lno--){ print lifo[lno]; }
}'
在shell脚本中,\
可以很方便地将单行命令拆解成多行。
工作原理
这个awk
脚本将每一行都存入关联数组中,用行号作为数组索引(行号由NR
给出)。读取完所有的行之后,awk
执行END
语句块。变量NR
是由awk
维护的。该变量中保存了当前行号。当awk
开始执行END
语句块时,NR
中的值就是总行数。在{ }
语句块中使用lno=NR
,从最后一行迭代到行号为0的第一行,同时以逆序形式打印出所有的行。