シェルスクリプトから不規則なテキストファイルを1行ずつ読み込む方法

シェルスクリプトから不規則なテキストファイルを1行ずつ読み込む方法

テキストファイルを1行ずつ読み込む必要がありますが、行は一定ではなくさまざまです。例えば

$ cat file1.txt
syntax error at or near "?" at character 1
syntax error at or near "[" at character 1
syntax error at or near "," at character 1
syntax error at or near "desc" at character 1
syntax error at or near "describtion" at character 1 `

行を読み取った後は、自動的にgrepコマンドに渡され、結果セットを提供する必要があります。テキストファイルにキャプチャされた行数とエラー数は予測できないためです。すべてが自動的に行われるはずです。

$ find file1.txt | xargs grep 'syntax error at or near "?" at character 1' | tail -1

シェルスクリプトに2行、3行…n行を入れて自動化するにはどうすればよいですか?

答え1

readコマンドを使用してファイルを 1 行ずつ読み取ることができます。たとえば、

while read -r line
 do 
 [[ $line = 'syntax error at or near "?" at character 1' ]] &&  printf '%s\n' "$line"
 done < file1.txt

答え2

grep私が正しく理解したら、1号線で作業したいという意味です。Nただ。これを行うには、次のheadツールを使用できます。

head -n 20 your_file | grep ...

これにより、grep最初の20行が実行されますyour_file。 20を次に置き換えるNあなたと関係があります。

別の説明と回答

file1.txt試してみたいパターンを含めたいという意味かもしれないと思いましたgrep。もしそれこの場合は、次を-f選択したいと思いますgrep

grep -f file1.txt files_you_want_to_search

このオプションは、投稿に示されているように、1-f行に1つのパターンであると想定される場所からパターンを取得するように指示します。この場合、ファイルの正規表現メタ文字に特別な意味を持たず、文字通り解釈するオプションを追加することもできます。grepfile1.txt-F

grep -Ff file1.txt files_you_want_to_search

答え3

さまざまなコメントのあなたの説明によると、grep-fオプションを使用してファイルから直接パターンリストを読む必要があるようです。

   -f FILE, --file=FILE
          Obtain  patterns  from  FILE,  one  per  line.   The  empty file
          contains zero patterns, and therefore matches nothing.   (-f  is
          specified by POSIX.)

-Fファイルに正規表現パターンが含まれていない場合は、リテラル(「固定」)文字列として解釈されるように強制を追加できます。

grep -Ff file_of_lines file_to_search_for_those_lines

file_to_search_for_those_lines結果は、の文字​​列と一致するすべての行のリストになりますfile_of_lines

関連情報