小编cod*_*ers的帖子

如何将 stderr 重定向到 stdout 然后是管道(apt-cache)

我正在尝试重定向stderrstdout然后pipe它,但我想我在这里缺少一些基本的东西。

要通过管道传输的命令和输出:

$ apt-cache show contractor
N: Can't select versions from package 'contractor' as it is purely virtual
N: No packages found
Run Code Online (Sandbox Code Playgroud)

Grep 不起作用 - 必须输出到stderr

$ apt-cache show contractor |grep virtual
Run Code Online (Sandbox Code Playgroud)

好的,让我们重定向stderrstdout

$ apt-cache show contractor 2>&1 |grep virtual
Run Code Online (Sandbox Code Playgroud)

不,这不起作用,为什么?

确认命令正在使用哪个文件描述符:

$ apt-cache show contractor 1>t ;cat t

$ apt-cache show contractor 2>t ;cat t
N: Can't select versions from package 'contractor' as it is purely virtual …
Run Code Online (Sandbox Code Playgroud)

bash pipe io-redirection file-descriptors

3
推荐指数
1
解决办法
211
查看次数

awk 从固定文本开始,直到第一个空行

我正在尝试输入一些只会返回由空行分隔的第一个“段落”或“部分”的内容。我以为我可以根据其他一些答案使用awksed获得一个范围,但它似乎不起作用。

$ cat txt
Package: plasma-desktop
Architecture: amd64
Version: 4:5.12.9.1-0ubuntu0.1
Supported: 3y

Package: plasma-desktop
Architecture: amd64
Version: 4:5.12.4-0ubuntu1
Supported: 3y

$ cat txt |awk '/^Package:/,/^$/'
Package: plasma-desktop
Architecture: amd64
Version: 4:5.12.9.1-0ubuntu0.1
Supported: 3y

Package: plasma-desktop
Architecture: amd64
Version: 4:5.12.4-0ubuntu1
Supported: 3y
Run Code Online (Sandbox Code Playgroud)

它不应该只返回第一个“部分”吗?(按照: Grep 从固定文本开始,直到第一个空行https://www.unix.com/shell-programming-and-scripting/148692-awk-script-match-pattern-till-blank-line .html )

  • 如果我使用grep -ve ^$空行被删除,那么就没有特殊字符。
  • 如果我尝试提取不同的部分,我会从两个“部分”中获取部分:

    $ cat txt |awk '/^Package:/,/^Version:/'
    Package: plasma-desktop
    Architecture: amd64
    Version: 4:5.12.9.1-0ubuntu0.1
    Package: plasma-desktop
    Architecture: amd64
    Version: 4:5.12.4-0ubuntu1
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果我使用sed -n '/^Package:/,/^$/p'或 …

bash sed awk shell-script

2
推荐指数
1
解决办法
565
查看次数

标签 统计

bash ×2

awk ×1

file-descriptors ×1

io-redirection ×1

pipe ×1

sed ×1

shell-script ×1