假设,你的某条命令,会输出类似下方函数的表格式信息:
function printTable() {
echo 'Name Email Tel Level
AAA [email protected] 123456 A
BBB [email protected] 123456 B
CCC [email protected] 123456 B
DDD [email protected] 123456 C
EEE [email protected] 123456 A'
}
tail 命令负责打印文件尾部的文本数据。
tail
不带任何命令,会输出文件的所有文本。
tail -n 100
, 会输出文本最后100行文本。
tail -n +<n+1>
,输出从第n行开始的所有文本。
下方代码 -n +2
会输出第二行开始往后的所有文本,也就跳过了表格的表头行。
$ printTable | tail -n +2
AAA [email protected] 123456 A
BBB [email protected] 123456 B
CCC [email protected] 123456 B
DDD [email protected] 123456 C
EEE [email protected] 123456 A
$ printTable | tail -n +2 | awk '{print $1}'
AAA
BBB
CCC
DDD
EEE
你也可以同时获取多列信息:
$ printTable | tail -n +2 | awk '{print $1,$3}'
AAA 123456
BBB 123456
CCC 123456
DDD 123456
EEE 123456
head
命令与 tail
命令相反,会打印文件的前n行文本。两者互相配合,即可获取第m行的文本。
下方例子演示了如何获取表格的第三行文本。
$ printTable | tail -n +2 | head -n 3 | tail -n 1
CCC [email protected] 123456 B
head -n 3
命令输出前3行文本,tail -n 1
输出倒数最后一行文本。
为了"第几行第几列"的描述能符合表格的语义,这里使用了 tail -n +2
命令跳过了表头。
实际写脚本,我们可以直接 printTable | head -n 4 | tail -n 1
来获取包含表头在内的第四行文本。
把上面所有命令结合起来,我们就能精确定位表格的某行某列。
例如我们可以这样获取第三行,第2列,用户CCC的邮件地址。
$ printTable | tail -n +2 | head -n 3 | tail -n 1 | awk '{print $2}'
[email protected]
如果你嫌麻烦,也可以定义一个bash函数,方便以后使用。
function readTable() {
local ROW=$1
local COLUMN=$2
cat | tail -n +2 | head -n "$ROW" | tail -n 1 | awk -v C=$COLUMN '{print $C}'
}
有时候,你可能会遇到不知道有多少列数据的情况。如果你想获取最后3列数据,你可以这样做:
$ printTable | awk '{print $(NF-2), $(NF-1), $NF}'
Email Tel Level
[email protected] 123456 A
[email protected] 123456 B
[email protected] 123456 B
[email protected] 123456 C
[email protected] 123456 A