我正在尝试使用sed解析一些大量的SQL查询日志,并希望提取每个查询中连接的所有表的名称。这是我正在尝试的:
echo '[SQL_STMT="SELECT A FROM TABLEA JOIN TABLEB ON SOMETHING JOIN TABLEC ON SOMETHINGELSE WHERE A = 1"]' \
| sed -e 's/SQL_STMT=.*JOIN \([A-Z0-9_]*\) .*\]$/SQL_JOINS="\1"]/g'
但这只会返回以下内容:
[SQL_JOINS="TABLEC"]
我希望看到的是这样的:
[SQL_JOINS="TABLEB TABLEC"]
并使其适用于任意数量的连接
那么如何构建反向引用以便它获取所有连接的表?
答案 0 :(得分:0)
如果你对perl解决方案没问题,试试这个:
$ echo "......" | perl -ne '@x=/JOIN (\w+)/g;print "[SQL_JOINS=\""."@x"."\"]";'
使用上述测试:
$ echo "[SQL_STMT=\"SELECT A FROM TABLEA JOIN TABLEB ON SOMETHING JOIN TABLEC ON SOMETHINGELSE WHERE A = 1\"]" | perl -ne '@x=/JOIN (\w+)/g;print "[SQL_JOINS=\""."@x"."\"]";'
[SQL_JOINS="TABLEB TABLEC"]
Sed解决方案:
echo ...|sed -n ':a;/JOIN/{s/[^J]*JOIN \([A-Z0-9_]*\)/\1\n/;P;D;ta}' | sed -e ':a;N;s/\n/ /;ta' | sed 's/.*/[SQL_JOINS=\"&\"]/'
第一个sed打印所有表名,第二个将所有表名连接成一个,最后一个将其格式化为获得所需格式。