24

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

sed -n '1p;/6330162/p' infile*.txt > outfile.txt

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

head -1 infile1.txt;  grep -i '6330162' infile1.txt > outfile.txt

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

4

6 回答 6

40

下面的意思是你只需要输入一次命令(而不是使用 && 并输入两次),它也很容易理解。

some-command | { head -1; grep some-stuff; }

例如

ps -ef | { head -1; grep python; }

更新:这似乎只适用于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

我命名为hgrep.sh. 然后你可以像这样使用:

ps -ef | ./hgrep.sh -i chrome

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

于 2013-10-14T09:07:17.907 回答
16

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

some-command | sed -n '1p;/PATTERN/p'

使用多行标题也很容易:

$ 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           

重申一下,@ samthebest的解决方案仅适用于非常特定的情况;这将适用于任何写入标准输出的命令。

于 2018-05-06T21:45:30.190 回答
3
for file in *
do
  [ "$file" = outfile.txt ] && continue
  head -n 1 "$file"
  grep -i '...' "$file"
done > outfile.txt
于 2012-10-16T17:36:37.977 回答
1

我会这样做的:

ps -fe | awk '{ if ( tolower($0) ~ /network/ || NR == 1 ) print $0}' 
于 2017-01-02T19:07:17.843 回答
0

嗨,好奇,您可以将 xargs 与您的 cmd 一起使用。

find /mahesh  -type f |xargs -I {} -t /bin/sh -c "head -1 {}>>/tmp/out.x|grep -i 6330162 {} >>/tmp/out.x"

/mahesh 是您的文件所在的目录,输出放在 /tmp/out.x 中

于 2012-10-17T10:14:02.037 回答
0

我写了一个脚本hgrep来替换命令grep

#!/bin/bash

content=`cat`
echo "$content" | head -1
echo "$content" | tail -n+2 | grep "$@"

然后df -h | hgrep tmpfs将输出标题和行包括tmpfs

报价至关重要。

于 2021-09-27T07:57:17.867 回答