查找具有多种模式的文件行

时间:2014-04-30 13:30:28

标签: regex bash awk sed pattern-matching

我想查找具有特殊模式的文件行,并将其打印在另一个文件中。 例如:

a(code(4),message(h),b)

x(code(6),6)

v(message(d),b)

我想要低于输出:

4 h

6

d

这意味着如果存在代码和消息部分,则打印它们的值,如果其中一个存在,则仅打印一个

编辑: 我有这样的行:

ereport(ERROR,(errmsg("database hash table corrupted during cleanup --- abort")));

ereport(FATAL,(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),errmsg("data directory \"%s\" has wrong ownership",DataDir),errhint("The server must be started by the user that owns the data directory.")));

我需要以下输出:

database hash table corrupted during cleanup --- abort

ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE[tab]data directory \"%s\" has wrong ownership[tab]The server must be started by the user that owns the data directory.

这些是PostgreSQL中的错误消息,我想找到它们的列表。

2 个答案:

答案 0 :(得分:1)

您可以使用:

awk -F"[()]" '{for (i=3;i<=NF;i+=2) printf "%s ",$i;print ""}' file
4 h
6
d

它不适用于您的真实数据

答案 1 :(得分:1)

对于上面的示例,此代码将根据需要提取数据:

for i in `cat data.txt`
do
    echo $i | grep -E 'message|code' | sed 's/^.(//' | sed 's/code(//' | sed 's/,[a-z])//' | sed 's/,message(//' | cut -d, -f1 | sed 's/)/ /' | sed 's/)//' | sed 's/message(//'
done