【问题标题】:can't get specific line from bash output无法从 bash 输出中获取特定行
【发布时间】:2019-04-14 03:23:19
【问题描述】:

我正在尝试简单的 bash 脚本:

/usr/libexec/java_home -V

输出是:

Matching Java Virtual Machines (3):
11.0.1, x86_64: "Java SE 11.0.1"    /Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk/Contents/Home
10.0.1, x86_64: "Java SE 10.0.1"    /Library/Java/JavaVirtualMachines/jdk-10.0.1.jdk/Contents/Home
1.8.0_192, x86_64:  "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_192.jdk/Contents/Home

似乎是 4 行,但如果我尝试获取第二行:

/usr/libexec/java_home -V | sed -n 2p

输出是一样的。没有额外的线路。如果我尝试第一个 - 我得到了第二个:

/usr/libexec/java_home -V | sed -n 1p

输出:

Matching Java Virtual Machines (3):
    11.0.1, x86_64: "Java SE 11.0.1"    /Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk/Contents/Home
    10.0.1, x86_64: "Java SE 10.0.1"    /Library/Java/JavaVirtualMachines/jdk-10.0.1.jdk/Contents/Home
    1.8.0_192, x86_64:  "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_192.jdk/Contents/Home

/Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk/Contents/Home

如果我将输出分配给数组并计算它的大小:

array=( $(/usr/libexec/java_home -V) )
array_size=${#array[@]}
echo $array_size

它显示大小 = 1:

Matching Java Virtual Machines (3):
    11.0.1, x86_64: "Java SE 11.0.1"    /Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk/Contents/Home
    10.0.1, x86_64: "Java SE 10.0.1"    /Library/Java/JavaVirtualMachines/jdk-10.0.1.jdk/Contents/Home
    1.8.0_192, x86_64:  "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_192.jdk/Contents/Home

1

我做错了什么?

【问题讨论】:

  • 可能输出到stderr 而不是stdout,尝试/usr/libexec/java_home -V 2>&1 | sed -n 1p 可能"Matching Java.." 是到stdout,其余到stderr。 (很难说)。您始终可以使用/usr/libexec/java_home -V 2>/dev/null 来消除输出到stderr 进行测试的内容。如果都是stdout,那么有一些东西会阻止正常的分词发生。您是否在父 shell 中更改了 IFS
  • /usr/libexec/java_home -V 2>&1 | sed -n 1p 很好用!谢谢!
  • 当然,很高兴它有帮助。您的 sed 调用是正确的,因此唯一可能的其他原因是脚本正在输出到 stderr (它没有被传送到 sed 并且只是出现在您的屏幕上,使它看起来像 sed 不是在职的)。现在你知道当类似的事情出现时要寻找什么——我们都以同样的方式吸取了教训:)

标签: bash stdout stderr io-redirection


【解决方案1】:

似乎正在发生的事情是您的脚本/usr/libexec/java_home -V 正在将其部分或全部输出输出到stderr,而不是写入stdout。由于 shell 管道 ('|') 将前一个命令的 stdout 连接到后一个命令的 stdin,因此 /usr/libexec/java_home -Vstderr 的任何输出都会写入您的屏幕,并且不会被 @ 处理987654329@ 让它看起来像 sed 不起作用。

要测试并纠正问题,只需将 stderr 从您的脚本重定向到 stdout,然后将结果通过管道传输到 sed,确保 sed 接收您脚本的所有输出,例如

$ /usr/libexec/java_home -V 2>&1 | sed -n 1p

很高兴它有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2016-04-03
    • 2011-09-06
    • 2015-09-16
    • 1970-01-01
    • 2018-03-06
    相关资源
    最近更新 更多