在'grep'结果中包含标题

Cur*_*ous 11 shell grep

有没有办法将'head -1'和'grep'命令合并为一个目录中的所有文件,并将输出重定向到输出文件.我可以使用'sed'来做到这一点,但它似乎没有grep那么快.

sed -n '1p;/6330162/p' infile*.txt > outfile.txt
Run Code Online (Sandbox Code Playgroud)

使用grep我可以一次执行以下一个文件:

head -1 infile1.txt;  grep -i '6330162' infile1.txt > outfile.txt
Run Code Online (Sandbox Code Playgroud)

但是,我需要为目录中的所有文件执行此操作.插入通配符没有帮助,因为它首先打印标题然后输出grep输出.

sam*_*est 23

以下意味着您只需要输入一次命令(而不是使用&&并输入两次),这一点也很容易理解.

some-command | { head -1; grep some-stuff; }
Run Code Online (Sandbox Code Playgroud)

例如

ps -ef | { head -1; grep python; }
Run Code Online (Sandbox Code Playgroud)

更新:这似乎只是工作ps,抱歉,但我想这通常是人们想要的.

如果你想让它适用于任意命令,你似乎必须编写一个迷你脚本,例如:

#!/bin/bash

first_line=true

while read -r line; do
    if [ "${first_line}" = "true" ]; then
        echo "$line"
        first_line=false
    fi
    echo "$line" | grep $*
done
Run Code Online (Sandbox Code Playgroud)

这是我的名字hgrep.sh.然后你可以像这样使用:

ps -ef | ./hgrep.sh -i chrome
Run Code Online (Sandbox Code Playgroud)

这种方法的好处在于我们正在使用grep所有标志的工作方式完全相同.

  • 经过进一步调查,我发现它适用于`ps -e`而不是`ps`.显然`ps -e`首先发送标题行,然后不发送任何内容,然后缓冲输出的其余部分.`head`必须认为流在第一行之后关闭,所以它退出,留下grep看其余的.tl; dr:这个技巧是偶然的. (2认同)
  • 这不是**通用的解决方案!我相信只有当第一个命令在发送它之前缓冲其整个输出(特定于应用程序并受缓冲区大小限制)时才会起作用,因为`head -1`将在读完后发送SIGPIPE,导致第一个命令停止. (2认同)

l0b*_*0b0 6

这将通过使用单个接收命令来工作:

some-command | sed -n '1p;/PATTERN/p'
Run Code Online (Sandbox Code Playgroud)

将其与多行标题一起使用也很容易:

$ sudo netstat --tcp --udp --listening --numeric --program | sed --quiet '1,2p;/ssh/p'
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1258/sshd           
tcp6       0      0 :::22                   :::*                    LISTEN      1258/sshd           
Run Code Online (Sandbox Code Playgroud)

重申,@ samthebest的解决方案将只在非常特殊的情况下工作; 这将与任何写入标准输出的命令一起使用。


Ign*_*ams 3

for file in *
do
  [ "$file" = outfile.txt ] && continue
  head -n 1 "$file"
  grep -i '...' "$file"
done > outfile.txt
Run Code Online (Sandbox Code Playgroud)