【问题标题】:sorting the sed output gives different results on Solaris 10 and 11对 sed 输出进行排序会在 Solaris 10 和 11 上给出不同的结果
【发布时间】:2016-04-19 12:30:28
【问题描述】:

我有一个从文件名中提取日期并计算唯一天数的命令:

find xml/ -type f -name "*.201604*.xml" | head -5 | sed "s/.*\.\(2016[0-9]\{4\}\)\(.*\)/\1/g" | sort | uniq -c

在 Solaris 10 上的结果是:

# find xml/ -type f -name "*.201604*.xml" | head -5 | sed "s/.*\.\(2016[0-9]\{4\}\)\(.*\)/\1/g" | sort | uniq -c
   2 20160412
   1 20160417
   2 20160418
# uname -a
SunOS localhost 5.10 Generic_150400-26 sun4u sparc SUNW,SPARC-Enterprise
# which sed sort
/usr/bin/sed
/usr/bin/sort

在 Solaris 11 上的结果是:

$ find xml/ -type f -name "*.201604*.xml" | head -5 | sed "s/.*\.\(2016[0-9]\{4\}\)\(.*\)/\1/g" | sort | uniq -c
   1 20160401
   1 20160403
   1 20160405
   1 xml/results/subres/ABC.DEF.GH01.20160401224003.123456.123456.xml
   1 xml/results/subres/ABC.DEF.GH02.20160412124035.234567.234567.xml
$ uname -a
SunOS localhost 5.11 11.2 sun4v sparc sun4v
$ which sed sort
/usr/bin/sed
/usr/bin/sort

出于某种原因,在 Solaris 11 上,sort 命令会导致 sed 返回完整的文件路径,而不是匹配的正则表达式。

它可以在没有排序的情况下工作(Solaris 11):

$ find xml/ -type f -name "*.201604*.xml" | head -5 | sed "s/.*\.\(2016[0-9]\{4\}\)\(.*\)/\1/g"
20160403
20160401
20160401
20160412
20160405

为什么?其他人有这种行为吗?

【问题讨论】:

  • 如果将sort | uniq -c 替换为简单的cat,在Solaris 11 上会得到什么输出?
  • @AndrewHenle 与sort 的结果相同,它显示两个文件名而不是正则表达式结果。
  • 此外,您在 Solaris 10 服务器上似乎有一个 root 提示符,这意味着您很可能正在运行 Solaris sh - 与 Linux 不同的是,Solaris 没有混淆 sh 和 @987654332 @.
  • @AndrewHenle,不,sed 没有别名。另外,root 提示符是假的,它是由 PS1="#" 设置的。 echo $SHELL 给我/usr/bin/bash

标签: regex sed solaris


【解决方案1】:

find 给出未排序的结果。在使用 head -5 之前对 find 的输出进行排序。
还有set LC_ALL=C

【讨论】:

  • 我知道find 未排序的结果。在这种情况下,在find 之后执行sort 是没有意义的,因为文件具有不同的命名约定,并且它们不会按日期排序。这就是为什么我需要用正则表达式提取日期。
【解决方案2】:

您在调用sed 之后调用sort,因此sort 不会影响sed 的行为方式。您只是在每台机器上获取不同版本的 sed,可能来自 /bin 的一个不理解转义的 ERE 字符以创建 RE 间隔(\{4\}),另一个来自 /usr/xpg4/bin 或类似的确实如此。

如果没有一些环境变化,你说 Solaris 11 在有/没有排序的情况下表现不同的情况不会发生 - 也许你在不同的 shell 中或运行不同的设置脚本或其他东西。

在两台机器上执行where sed(或which sedwhence sed 或...)

【讨论】:

  • 请注意在代码示例中,我已经做了which sed sort。路径是一样的。
  • 另外,在sed 之后没有sort,结果是正确的,所以看起来像sortcat 会影响sed。奇怪,因为这些是管道。
  • 而且,五个输出行中只有两个不是正则表达式匹配结果。所以,它匹配前三个,而不匹配两个。
  • 啊,如果您向我们展示了 sed 的输入,而不仅仅是输出,我们就会注意到这一点。不敢相信没有人,包括我,想告诉你发布这个。
【解决方案3】:

通过unset LANG 解决了问题。它被设置为en_US.UTF-8man 表示LANG 影响sed 命令执行。

【讨论】:

  • 为什么要通过管道对 sed 输出进行排序或不对此产生任何影响?
猜你喜欢
  • 2021-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-26
  • 1970-01-01
  • 2019-04-06
相关资源
最近更新 更多