一般ファイルの最初の10行から10個の「main()」を探します。

一般ファイルの最初の10行から10個の「main()」を探します。

最初の10行に「main()」テキストを含む通常のファイルに対応する引数を印刷するコマンドを作成します。
すべてのファイルを検索して最初の10行を見つけるにはどうすればよいですか?

答え1

GNU grepとPerlの正規表現を利用することもできます。これにより、入力ファイルの最初の10行以内に、main()文字列を含むすべての行が出力されます。

この-zオプションを使用すると、ファイルを解析し、grep操作用の1つの大きな文字列として処理できます(NUL文字を含まない限り)。-PgrepのPerlモードを有効-oにして一致する部分を表示し、-h一致する行の横に表示されないようにファイル名を非表示にし、-lファイル名のみを一覧表示します。

ファイル名と一致する行が必要な場合:

grep -HPoz  '\A(.*\n){0,9}\K[^\n]*main\(\)[^\n]*\n' file.txt

唯一一致する行は次のとおりです。

grep -hPoz '\A(.*\n){0,9}\K[^\n]*main\(\)[^\n]*\n' file.txt

-hファイルが複数ある場合にのみ必要)

ファイル名のみ:

grep -Pozl '\A(.*\n){0,9}\K[^\n]*main\(\)[^\n]*\n' file.txt

再帰なしで現在のディレクトリを実行するには:(ofc、上記のように要求時にgrepオプションを指定する必要があります)

find . ! -name . -prune -type f \
  -exec grep -HPoz '\A(.*\n){0,9}\K[^\n]*main\(\)[^\n]*\n' {} +

答え2

複数のファイルの最初の10行から特定のパターンを検索するには、次のようにします。

for file in *; do 
    head -n 10 "$file" | grep -F 'main()' 
done

これにより、一致する行が印刷されます。一致する行とファイル名を印刷するには、次のようにします。

for file in *; do 
    q=$(head -n 10 "$file" | grep -F 'main()')
    [ -z "$q" ] || printf '%s : %s\n' "$file" "$q"
done

一致する行を印刷せずにファイル名のみを印刷します。

for file in *; do 
    head -n 10 "$file" | grep -qF 'main()' && printf '%s\n' "$file" 
done

答え3

私は以下を使用しますawk

awk 'FNR <= 10 && index($0, "main()") {print FILENAME ":", $0}' ./*.c

関連情報