sed または awk を使用する「grep|cut」と同等のものは何ですか?

sed または awk を使用する「grep|cut」と同等のものは何ですか?

設定ファイルがあるとしましょう。/etc/emails.conf

email1 = [email protected] 
email2 = [email protected]
email3 = [email protected]

メールが届きたい2

私は次のことができます:

grep email2 /etc/emails.conf | cut -d'=' -f2 

email2を入手してください。しかし、sedまたはawkコマンドを使用して「よりクールに」実行し、cutコマンドで残されたスペースを削除する方法は?

答え1

awkを使うのはどうですか?

awk -F = '/email2/ { print $2}' /etc/emails.conf
  • -F =フィールドは「=」で区切られます。

  • '/email2/ { print $2}'「email2」に一致する行から2番目のフィールドを印刷します。

答え2

これ精密これに対応する内容は次のとおりです。

sed -n '/email2/{s/^[^=]*=\([^=]*\).*/\1/;p;}' < file

しかし、次のことをしたいかもしれません。

sed -n 's/^[^=]*email2[^=]*=[[:blank:]]*//p' < file

(つまり、email2最初のフロント部分のみが一致し、2番目のフロント部分(ある場合)だけでなく、最初の右側=(前のスペースをスキップ)にあるすべてのアイテムが返されます。==

答え3

perl -nlE 's/email2\s*=\s*// and say'    file

どこ:

  • perl -nl 一行ずつするのか…
  • s/email2 = // 可能であれば、検索されたEメールIDを削除してください...
  • say現在入力されている入力行を印刷します。
  • \s*0個以上の空白([\t\n]*と同じ)

答え4

フィールド区切り文字を「=」などの特殊値に設定する必要はありません。デフォルトでは、AWKはスキップする連続したスペースとタブをフィールド区切り文字として使用するため、ファイルの各行に3番目のフィールドスペースに先行文字のない3つのフィールドがあると解釈されます。

awk '/^email2/ { print $3 }'

生産する

[email protected]

上記は、で始まるすべての行とも一致しますemail2email20たとえば、使用できます。

awk '$1 == "email2" { print $3 }'

関連情報