Grep - 出力行の列3に文字列が含まれています。

Grep - 出力行の列3に文字列が含まれています。

特定の文字列を含む行を出力しようとしています。

行の例:

Column1:Column2:Column3 + ID
Column1:Column2:Column3 - ID
Column1:Column2:Column3

希望の出力:

Column1:Column2:Column3 + ID

頑張る-

awk -F: '$3 == + ID' < file.txt > out.txt

他の入力なしで列3から正確な「+ ID」を取得するため、出力は返されません。

今私はできることを知っています

grep -f " + ID" <file.txt >out.txt

ただし、+IDが列3にない場合は、+IDを含むすべての行が出力されます。例は次のとおりです。

出力:

Column1:Column2 + ID:Column3

+IDは列3ではなく列2にあります。

これで、特定の.txtファイルだけでなくすべてのファイルを検索しながら、ディレクトリ内でもこれを行いたいと思います。

答え1

文字列一致ではなく、フィールドの末尾に固定された正規表現一致を使用できます。

awk -F: '$3 ~ /+ ID$/' < file.txt
Column1:Column2:Column3 + ID

または行の末尾に固定するには、以下を使用しますgrep

grep '+ ID$' < file.txt
Column1:Column2:Column3 + ID

答え2

grep -Pie '(Column\d:?){3} + ID$' file.txt > out.txt

たとえば、Column1:パターンが3回以上繰り返される場合は、{3,}上記の内容を修正してください。

答え3

これは次の方法で行うことができます。

find dir -type f -exec grep -H '+ ID$' {} +

これにより、ディレクトリ内または下のすべての一般的なファイルが検索され、できるだけ多くのdirファイルgrep -H '+ ID$'が一括実行されます。結果には、正規表現に一致するファイルのファイル名に一致するファイルの行が含まれます。

ファイル名のみを取得するにはwith-lの代わりに使用し、一致する行のみを取得するにはを使用します。-Hgrep-L

正規表現は、行の末尾に正確な文字列を含むファイル内のすべての行+ ID$と一致します。+ ID

または、サブディレクトリに再帰できる機能はありませんが、find次のようになります。grep

grep -R '+ ID$' dir

grepこれを行わないシステム-H(非標準オプション)を持つシステムでは、次のものを使用できます。

find dir -type f -exec grep '+ ID$' /dev/null {} +

そのようなシステムでファイル名ではなく行のみを一致させるには、catファイルをまとめてgrepします。

find dir -type f -exec cat {} + | grep '+ ID$'

答え4

次のようにsubstrを使用できます。

awk '{ if (substr($0,position,length)=="+  ID" { print $0 } }' myfile.txt

関連情報