KSH:使用sed将文本返回到模式的右侧

时间:2013-05-06 17:22:33

标签: sed ksh

所有

我正在尝试使用sed编写一个KSH脚本(我是ksh的新手)从日志中提取这个SQL查询,但我希望它忽略时间戳和它后面的六个字符/空格。这是我到目前为止的代码......

cat file.log \
| sed -n '/---Query1/,/selected/p' \
| sed 's/^([0-9][0-9]:[0-9][0-9]:[0-9][0-9]??????)//g' \    # My problem
> newfile.log

===Input===

11:23:34 SQL> ---Query1    
11:23:34 SQL> select a.column1, b.column2, count(*)
11:23:34   2  from table1 a, table2 b
11:23:34   3  group by a.column1
11:23:34   4  order by 1, 2, 3;

a.column1   a.column2   count(*)
----------- ----------- ----------
foo         bar         32

1 row selected.


===Desired Output===

---Query1
select a.column1, b.column2, count(*)
from table1 a, table2 b
group by a.column1
order by 1, 2, 3;

a.column1   a.column2   count(*)
----------- ----------- ----------
foo         bar         32

1 row selected.

非常感谢您提供的任何帮助。

3 个答案:

答案 0 :(得分:2)

“?”在正则表达式中表示“前一个RE段的零或一次出现”,所以当你写:

[0-9]?

你说“数字为零或一次出现”。我怀疑你的意思是“?”在RE中它与shell globbing中的含义相混淆,这是“任何单个字符”。 RE元字符表示“任何单个字符”是“。”,而不是“?”。

所以我想你写的时候:

sed 's/^([0-9][0-9]:[0-9][0-9]:[0-9][0-9]??????)//g'

你其实打算写:

sed 's/^([0-9][0-9]:[0-9][0-9]:[0-9][0-9]......)//g'

你可以缩写为:

sed 's/^([0-9][0-9]:[0-9][0-9]:[0-9][0-9]??????)//g'

对于某些(例如GNU)sed,你可以写“。{6}”而不是6个明确的“。”s。

请注意,您不需要“cat”,如果您将管道放在每行的末尾而不是下一行的开头,那么您也不需要转义反斜杠。您也不需要RE周围的parens,因为您从不反向引用或以其他方式使用它,例如:

sed -n '/---Query1/,/selected/p' file.log |
sed 's/^[0-9][0-9]:[0-9][0-9]:[0-9][0-9]......//g' > newfile.log

答案 1 :(得分:1)

刚刚对您的示例数据进行了一些测试,它在这里工作:

 sed -r '/^[0-9][0-9]:[0-9][0-9]/{s/^.*SQL> *//;s/^[0-9:]* +[0-9]+ +(.)/\1/}' file

答案 2 :(得分:1)

这可能适合你(GNU sed):

 sed -r 's/^..:..:...{6}//' file