【问题标题】:Why GNU GAWK 3.1.5 on Solaris 5.10 does not match the pattern?为什么 Solaris 5.10 上的 GNU GAWK 3.1.5 与该模式不匹配?
【发布时间】:2019-03-21 18:16:57
【问题描述】:

我正在通过 awk 解析 SFTP 'ls -l' 输出,只打印现有目录的结果(是的,我知道 Python 更好,解析 ls 不是一个好主意,任务的技术限制)。这是我收到的输出:

bash-3.2$ sftp my-server < batch_ls.sftp | gawk 'BEGIN{d=-1;wd=1}/^sftp> c/{d++;wd=0}/Coul/{wd=1}wd==0{print $0,d,wd}'

Connecting to my-server...
sftp> cd /ik/sftp_source/alpha 0 0
sftp> ls -l 0 0
drwxr-xr-x    2 65740    102          4096 Mar 21 05:15 . 0 0
drwxr-xr-x    4 65740    102          4096 Mar 21 04:21 .. 0 0
-rw-r--r--    1 65740    102            35 Mar 21 05:15 0452984832A8.234 0 0
-rw-r--r--    1 65740    102            34 Mar 21 05:15 0989855744A8.234 0 0
-rw-r--r--    1 65740    102            35 Mar 21 05:15 1258291200A8.234 0 0
-rw-r--r--    1 65740    102            34 Mar 21 05:15 1862270976A8.234 0 0
sftp> cd /ik/sftp_source/belta 1 0
Couldn't canonicalise: No such file or directory
sftp> ls -l 1 0
drwxr-xr-x    2 65740    102          4096 Mar 21 05:15 . 1 0
drwxr-xr-x    4 65740    102          4096 Mar 21 04:21 .. 1 0
-rw-r--r--    1 65740    102            35 Mar 21 05:15 0452984832A8.234 1 0
-rw-r--r--    1 65740    102            34 Mar 21 05:15 0989855744A8.234 1 0
-rw-r--r--    1 65740    102            35 Mar 21 05:15 1258291200A8.234 1 0
-rw-r--r--    1 65740    102            34 Mar 21 05:15 1862270976A8.234 1 0
sftp> cd /ik/sftp_source/delta 2 0
sftp> ls -l 2 0
drwxr-xr-x    2 65740    102          4096 Mar 21 05:15 . 2 0
drwxr-xr-x    4 65740    102          4096 Mar 21 04:21 .. 2 0
-rw-r--r--    1 65740    102            34 Mar 21 05:15 0335544320A8.234 2 0
-rw-r--r--    1 65740    102            35 Mar 21 05:15 0419430400A8.234 2 0
-rw-r--r--    1 65740    102            35 Mar 21 05:15 1073741824A8.234 2 0
-rw-r--r--    1 65740    102            34 Mar 21 05:15 1392508928A8.234 2 0

这里:

  • d是目录计数器

  • wd 是一个标志,用于了解我们是否正在处理正确目录的输出,或者我们未能“cd”需要的目录而我们仍在前一个目录中。 p>

看起来它没有捕捉到字符串的“无法”部分。谁能帮我想出一个更好的解决方案并解释为什么会发生这种情况?非常感谢!

PS请注意,“无法规范化...”行末尾没有附加 d 和 wd 值。

【问题讨论】:

  • 这些行可能会转到 stderr 而不是 stdout。运行您使用的命令时,您可能会重定向输出以对其进行处理,如果您想在一个管道中同时处理这两个命令,请尝试添加 2&gt;&amp;1
  • 我会将其作为答案发布,以便您接受并关闭问题。

标签: bash awk sftp solaris


【解决方案1】:

管道后面的命令部分看不到这些行,因为您正在重定向stdout,但sftp 正在将错误发送到stderr

如果你想将它们都重定向到gawk,你应该在你的命令中添加2&gt;&amp;1

bash-3.2$ sftp my-server < batch_ls.sftp 2>&1 | gawk 'BEGIN{d=-1;wd=1}/^sftp> c/{d++;wd=0}/Coul/{wd=1}wd==0{print $0,d,wd}'

【讨论】:

    猜你喜欢
    • 2018-10-24
    • 2012-09-23
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    相关资源
    最近更新 更多