Linuxでは、「/」記号で終わる前に、txt行に「db」という単語を含むtxtファイルから最初の単語を抽出します。

Linuxでは、「/」記号で終わる前に、txt行に「db」という単語を含むtxtファイルから最初の単語を抽出します。

2行を含むabc.txtファイルがあります。db特定の行の単語を含む行の最初の単語を抽出したいと思います。

abc.txt:

XYZ/db_abc.sql
ijkl/tables/table_name/tl_abc.sql

grepを試すと、grep "db" abc.txt「db」を含む行が表示されますが、最初の単語を出力として抽出したいと思いますXYZ

出力:

$ grep "db" abc.txt
XYZ/db_abc.sql

予想出力:

XYZ

同様に、grepを試すとgrep "tl" abc.txt「tl」を含む行が表示されますが、3番目の単語を出力として抽出したいと思いますtable_name

出力:

$ grep "tl" abc.txt
ijkl/tables/table_name/tl_abc.sql

予想出力:

table_name

ベストアンサー1

$ awk -F / -v q=db '$0 ~ q { print $(NF-1) }' file
XYZ
$ awk -F / -v q=tl '$0 ~ q { print $(NF-1) }' file
table_name

2つawkのコマンドは同じですが、異なる式を照会するために異なるパラメータが提供されます。コマンドラインの変数に割り当てられたawk文字列はq拡張正規表現として使用され、指定されたファイルのすべての行と一致します。式が 1 行に一致すると、最後の 2 番目のフィールドが印刷されます。これは、特殊変数NF(現在行のフィールド番号)を使用して2番目のフィールド()のフィールド番号を計算することによってNF-1行われます。このユーティリティはフィールドをスラッシュで区切ります(を使用して表示されます-F /)。

これを変更すると、クエリパターンが最後のフィールドでのみ一致することが保証されます。

awk -F / -v q=tl '$NF ~ q { print $(NF-1) }' file

また、次の行にのみ興味があることを確認してください.sql

awk -F / -v q=tl '/\.sql$/ && $NF ~ q { print $(NF-1) }' file

おすすめ記事