IMLC.ME

bash 如何获取m行n列的输出

假设,你的某条命令,会输出类似下方函数的表格式信息:

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

获取第n列信息

$ 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

获取第m行信息

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 来获取包含表头在内的第四行文本。

获取第m行n列的信息

把上面所有命令结合起来,我们就能精确定位表格的某行某列。

例如我们可以这样获取第三行,第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}'
}

打印最后n列

有时候,你可能会遇到不知道有多少列数据的情况。如果你想获取最后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