如何使用 AWK 仅打印匹配项旁边的列

How to print only the columns next to a match using AWK

下面是示例文件,我想在其中打印匹配项旁边的列中的值..

$> cat sample.txt
DATABASE ORACLE, DB_TYPE Relational, OS OEL 5
VERSION 12.2.0.1

DATABASE MongoDB, DB_TYPE NOSQL, OS RedHat 7
VERSION 3.2
DATABASE MySQL, DB_TYPE Relational
VERSION 5.5

以 DATABASE 和 VERSION 开头的行,我将它们加入如下:

$> grep -i "^DATABASE\|^VERSION" sample.txt | sed 'N;s/,/\t/;s/\n/\t/'
DATABASE ORACLE  DB_TYPE Relational, OS OEL 5   VERSION 12.2.0.1
DATABASE MongoDB         DB_TYPE NOSQL, OS RedHat 7     VERSION 3.2
DATABASE MySQL   DB_TYPE Relational     VERSION 5.5

但现在我只想打印 DATABASE、DB_TYPE 和 VERSION 旁边的列,我做了类似的事情。

$> grep -i "^DATABASE\|^VERSION" sample.txt | sed 'N;s/,/\t/;s/\n/\t/' |awk -v val1='DATABASE' -v val2='DB_TYPE' -v val3='VERSION' -F ' ' '{for (i=1; i<=NF; i++) if ($i==val1 || $i==val2 || $i==val3) {n=i+1; print $n} }' 
ORACLE
Relational,
12.2.0.1
MongoDB
NOSQL,
3.2
MySQL
Relational
5.5

但我期待这样的事情

ORACLE      Relational      12.2.0.1
MongoDB     NOSQL           3.2
MySQL       Relational      5.5

对于您的示例,这将起作用: grep -i "^DATABASE\|^VERSION" sample.txt | sed 'N;s/,/\t/;s/\n/\t/' | awk 'BEGIN { OFS = " " } /DATABASE/ {print ,,$NF}'

搜索出现的 DATABASE,输出文件分隔符 (OFS) 是制表符 - 了解如何在您的特定 OS

的引号之间插入制表符

awk 救援!

$ tr ',' '\n' <file | 
  awk '/DATABASE|DB_TYPE|VERSION/{printf "%s", OFS; if(++c%3==0)print""}'

ORACLE Relational 12.2.0.1
MongoDB NOSQL 3.2
MySQL Relational 5.5

您可以将 OFS 设置为制表符或管道到 column -t 以进行表格格式设置。