web-dev-qa-db-ja.com

grepを使用して、ファイルの最初の行だけで特定の文字列を検索するにはどうすればよいですか?

Grepを使用してファイル内の文字列を検索する方法はありますが、これらのファイルの最初の行のみを検索するにはどうすればよいですか?

3
Michiel Pater

@Robのコメントを実装して、目的の結果を得ることに成功しました。

stringを文字列に置き換えます。

grep -Rin "string" . | grep ":1:.*string" > result.txt

現在のディレクトリでstringを大文字と小文字を区別せずに再帰的に検索し、行番号を出力します。次に、1行目にあるファイル内のオカレンスを検索し、result.txtというファイルに出力を保存します。

2
Michiel Pater

さらに2つの選択肢:

awk

awk '{if ($0~"pattern") print $0; nextfile;}' mydir/*

または、awkバージョンがnextfileをサポートしていない場合(StéphaneChazelasに提案をありがとう):

awk 'FNR==1{if ($0~"pattern") print $0;}' mydir/*

次のファイルに切り替える前に最初の行のみを読み取り、"pattern"と一致する場合にのみ印刷します。

利点は、パターンを検索するフィールド(たとえば$2を使用して2番目のフィールドのみを検索する)と出力(たとえば$3を使用して3番目のフィールドを印刷する)の両方を微調整できることです。またはFILENAME、またはそれらの組み合わせ)。

FNR(「現在の入力レコード番号」、つまり行番号)バージョンを使用すると、grepを実行する行をさらに微調整できることに注意してください:FNR==3 3行目、FNR<10最初の10行など(この場合は、非常に大きなファイルを処理していて、awkバージョンがそれをサポートしている場合、FNRnextfileを混合してパフォーマンスを向上させることができます。)

headを使用して、ファイル名を保持する

head -n1 -v mydir/files*|grep -B1 pattern

head-vオプションはファイル名を出力し、grepのオプション-B1は一致する行の前の行、つまりファイル名を出力します。ファイル名だけが必要な場合は、grepにパイプで転送できます。

head -n1 -v mydir/*|grep -B1 pattern|grep ==>

コメントのdon_crisstiが気づいたように、パターン自体に一致するファイル名には注意してください…

これはまさにそれを行うPerlオンラインです

Perl -ne 'print if /MY_SEARCH_STRING/; exit' myfile.txt

これは、キーワードMY_SEARCH_STRINGはファイルの最初の行にありますmyfile.txt。ファイル全体を検索する必要がある場合は、ワンライナーからexitを削除してください。

1
Govind Kailas

これは、次のようなPerlスクリプトの(悪い)例です。

#!/usr/bin/Perl -w

foreach (@ARGV) {
    my $filename = $_;
    open my $file, '<', $filename; 
    my $line = <$file>; 
    close $file;

    print "$filename\n" if $line =~ /your-match-text/;
}
0
Sig-IO

このようなものを試してください。この内容でファイルFinder.shを作成します。ファイルのパラメーターを必要に応じて変更します。

#!/bin/bash

# Where to search
DIR="/path/search/dir"

# Search string
SEARCH="my-string"

FILES=$(find "$DIR" -type f)

for F in $FILES; do
   head -1 $F | grep -w "$SEARCH"
done

ファイルを保存し、chmod + x Finder.sh

./Finder.shを実行します

注:root権限でファイルを検索する場合は、Sudoまたはrootユーザーを使用する必要があります。

0
Peycho Dimitrov

結果として完全な文字列のリストが必要ですか、それとも文字列を含むファイルのリストが必要ですか?これは、シェルスクリプト(* .sh)の行番号1(-n1)を検索し、「bash」を含む文字列を収集します。

head -n1 *.sh | grep bash > fullstring.txt

fullstring.txtには次のようなものが含まれます。

#!/bin/bash
#!/bin/bash
0
Ken Wood

試してください:

$ case "$(head -n 1 < file)" in (*pattern*) echo Match ;; esac
Match
0
cuonglm