在'grep'结果中包含标题

时间:2012-10-16 17:32:48

标签: shell grep

有没有办法将'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输出。

5 个答案:

答案 0 :(得分:22)

以下表示您只需输入一次命令(而不是使用&&并输入两次),这一点也很容易理解。

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

e.g。

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

答案 1 :(得分:5)

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

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           

reiterate,@ samthebest的解决方案仅适用于非常具体的情况;这适用于任何写入标准输出的命令。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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

其中/ mahesh是dir,你的文件在哪里,输出放在/tmp/out.x中

答案 4 :(得分:0)

我会这样做的:

@model login.Models.Home

@using(Html.BeginForm("Register","Home"))
{
 <h1>Please Register</h1>
 <p>
   <label>Your First Name</label>
    @Html.TextBoxFor(s=>s.FirstName)
    @Html.ValidationMessageFor(s => s.FirstName)
 </p>
<p>
    <label>Your Last Name</label>
    @Html.TextBoxFor(s=>s.LastName)
    @Html.ValidationMessageFor(s => s.LastName)
</p>
 <p>
    <label>Your Email</label>
    @Html.TextBoxFor(s=>s.Email)
    @Html.ValidationMessageFor(s => s.Email)
</p>
<p>
    <label>Your Password</label>
    @Html.TextBoxFor(s=>s.Password)
    @Html.ValidationMessageFor(s => s.Password)
</p>
<p>
    <label>Confrim Password</label>
    @Html.TextBoxFor(s=>s.PasswordConfirmation)
    @Html.ValidationMessageFor(s => s.PasswordConfirmation)
</p>
<input type="submit" name="submit" value="Register!"/>
}
@if(!string.IsNullOrEmpty(ViewBag.message))
  {
      <p>@ViewBag.message</p>
  }