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