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的第一行,同时以逆序形式打印出所有的行。
极客教程