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

KSH:使用sed将文本返回到模式右侧,sed,ksh,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 S

全部,

我正在尝试使用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.

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

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

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

刚刚对您的示例数据做了一个小测试,它在这里起作用:

 sed -r '/^[0-9][0-9]:[0-9][0-9]/{s/^.*SQL> *//;s/^[0-9:]* +[0-9]+ +(.)/\1/}' file
正则表达式中的“?”表示“前一个RE段的出现次数为零或1次”,因此当您写入时:

[0-9]?
你说的是“一个数字出现零次或一次”。我怀疑你理解了“?”的意思,因为你不明白它在shell globbing中的意思,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
正则表达式中的“?”表示“前一个RE段的出现次数为零或1次”,因此当您写入时:

[0-9]?
你说的是“一个数字出现零次或一次”。我怀疑你理解了“?”的意思,因为你不明白它在shell globbing中的意思,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
这可能适用于您(GNU-sed):

这可能适用于您(GNU-sed):


+1用于示例输入/输出和代码。继续发帖,祝你好运。样本输入/输出和代码+1。继续发帖,祝你好运。它工作得很好,谢谢你的教训。大约两周前,我打开了我的第一本KSH书,所以我现在正在努力吸收我能吸收的一切。了解shell最重要的一点是,尽管它有编程语言构造(if、while等),但它并不是作为编程语言使用的。它是一个调用工具的环境。通常,如果您发现自己在shell中编写循环,您就没有抓住要点,而且有一种工具更适合这项工作。创建/销毁/等待进程或创建/删除/移动文件时会出现例外情况。因此,如果你愿意,可以读一本shell书籍,但要花更多的时间学习你从shell调用的工具,awk是最划算的工具。它工作得非常好,谢谢你的教训。大约两周前,我打开了我的第一本KSH书,所以我现在正在努力吸收我能吸收的一切。了解shell最重要的一点是,尽管它有编程语言构造(if、while等),但它并不是作为编程语言使用的。它是一个调用工具的环境。通常,如果您发现自己在shell中编写循环,您就没有抓住要点,而且有一种工具更适合这项工作。创建/销毁/等待进程或创建/删除/移动文件时会出现例外情况。因此,如果你愿意,可以读一本shell书籍,但要投入更多的时间学习你从shell调用的工具,而awk是最划算的工具。