【问题标题】:KSH: using sed to return text to the right of a patternKSH:使用 sed 将文本返回到模式的右侧
【发布时间】:2013-04-30 12:15:09
【问题描述】:

全部,

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

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

【问题讨论】:

  • +1 用于示例输入/输出 AND 代码。继续发帖,祝你好运。

标签: sed ksh


【解决方案1】:

“?”在正则表达式中的意思是“前面的 RE 段出现零次或 1 次”,所以当你写的时候:

[0-9]?

您是在说“一个数字出现 0 次或 1 次”。我怀疑你得到了“?”的意思。在 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 个显式的“.”。

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

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

【讨论】:

  • 效果很好,感谢您的课程。大约两周前,我打开了我的第一本 KSH 书,所以我现在正在努力吸收任何我能吸收的东西。
  • 了解 shell 最重要的一点是,虽然它具有编程语言结构(if、while 等),但它并不打算用作编程语言。它是一个调用工具的环境。通常,如果您发现自己在 shell 中编写了一个循环,那么您就错过了重点,并且有一个更适合这项工作的工具。当您创建/销毁/等待进程或创建/删除/移动文件时例外。因此,如果您愿意,请阅读一本 shell 书籍,但要花更多时间学习从 shell 调用的工具,而 awk 是最划算的。
【解决方案2】:

这可能对你有用(GNU sed):

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-27
      • 1970-01-01
      • 2016-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多