unix awk命令没有列出多个匹配的模式

时间:2014-02-28 14:09:41

标签: linux bash shell unix awk

我有以下unix变量模式。我想根据'CREATE' , 'TABLE' & ','模式

进行搜索和输出
a ="CREATE TABLE T1, is my TABLE but , DROP TABLE is not CREATE my TABLE T2, is table" # it may keep going but pattern is same ....
echo $a | awk -F'CREATE' '{print $2}' | awk -F'TABLE' '{print $2}' | awk -F',' '{print $1}'

输出

T1

我想打印

T1
T2
...

2 个答案:

答案 0 :(得分:1)

使用grep会更容易:

grep -oP 'CREATE .*?TABLE \K\w+' <<< "$a"
T1
T2

答案 1 :(得分:1)

您的样本数据不重要,但您可以使用以下想法:

awk -v RS=, '/TABLE/&&/CREATE/{print $NF}'

<强>阐释:

  • 我们将Record Separator设置为,,因此它会在它看到的每个,处拆分该行。因此,您的输入行被视为:

    CREATE TABLE T1

    is my TABLE but CREATE my TABLE T2

    is table

  • /TABLE/&&/CREATE是一个正则表达式,用于查看包含单词TABLECREATE的行。您可以包含仅与TABLE匹配的字边界,而不是CONSTABLE

  • print $NF表示打印最后一个字段。 NF是一个特殊的awk变量,包含多个字段,$NF包含最后一个字段的值。

$ echo "CREATE TABLE T1, is my TABLE but CREATE my TABLE T2, is table" | awk -v RS=, '/TABLE/&&/CREATE/{print $NF}'
T1
T2