shell 在“grep”结果中包含标头

eoigrqb6  于 2023-03-13  发布在  Shell
关注(0)|答案(7)|浏览(193)

有没有一种方法可以将“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输出。

iq0todco

iq0todco1#

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

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,因此所有标志的工作方式完全相同。

7ivaypg9

7ivaypg92#

这将通过使用单个接收命令来实现:

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的解决方案只在非常特殊的情况下有效;这将适用于任何写入标准输出的命令。

hwazgwia

hwazgwia3#

for file in *
do
  [ "$file" = outfile.txt ] && continue
  head -n 1 "$file"
  grep -i '...' "$file"
done > outfile.txt
1cklez4t

1cklez4t4#

我也会这么做的:

ps -fe | awk '{ if ( tolower($0) ~ /network/ || NR == 1 ) print $0}'
owfi6suc

owfi6suc5#

你好好奇,你可以在cmd中使用xargs。

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中

91zkwejq

91zkwejq6#

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

#!/bin/bash

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

然后df -h | hgrep tmpfs将输出标题和行,包括tmpfs
这句话至关重要。

j5fpnvbx

j5fpnvbx7#

如果perl可以,您可以用途:some-command | perl -ne 'print if $.==1 | /some-stuff/'

相关问题