所有
我正在尝试使用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.
非常感谢您提供的任何帮助。
答案 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