Grepを使用してファイル内の文字列を検索する方法はありますが、これらのファイルの最初の行のみを検索するにはどうすればよいですか?
@Robのコメントを実装して、目的の結果を得ることに成功しました。
string
を文字列に置き換えます。
grep -Rin "string" . | grep ":1:.*string" > result.txt
現在のディレクトリでstring
を大文字と小文字を区別せずに再帰的に検索し、行番号を出力します。次に、1行目にあるファイル内のオカレンスを検索し、result.txt
というファイルに出力を保存します。
さらに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
バージョンがそれをサポートしている場合、FNR
とnextfile
を混合してパフォーマンスを向上させることができます。)
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
を削除してください。
これは、次のような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/;
}
このようなものを試してください。この内容でファイル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ユーザーを使用する必要があります。
結果として完全な文字列のリストが必要ですか、それとも文字列を含むファイルのリストが必要ですか?これは、シェルスクリプト(* .sh)の行番号1(-n1)を検索し、「bash」を含む文字列を収集します。
head -n1 *.sh | grep bash > fullstring.txt
fullstring.txtには次のようなものが含まれます。
#!/bin/bash
#!/bin/bash
試してください:
$ case "$(head -n 1 < file)" in (*pattern*) echo Match ;; esac
Match