下面是我希望在匹配旁边的列中打印值的示例文件。
$> 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
答案 0 :(得分:2)
awk
救援!
$ tr ',' '\n' <file |
awk '/DATABASE|DB_TYPE|VERSION/{printf "%s",$2 OFS; if(++c%3==0)print""}'
ORACLE Relational 12.2.0.1
MongoDB NOSQL 3.2
MySQL Relational 5.5
您可以将OFS设置为制表符或管道到column -t
以进行表格格式化。
答案 1 :(得分:0)
对于您的示例,这将起作用:
grep -i "^DATABASE\|^VERSION" sample.txt | sed 'N;s/,/\t/;s/\n/\t/' | awk 'BEGIN { OFS = " " } /DATABASE/ {print $2,$4,$NF}'
搜索DATABASE,输出文件分隔符(OFS)的出现位置 - 找出如何在特定操作系统的引号之间插入选项卡