設定ファイルがあるとしましょう/etc/emails.conf
email1 = [email protected]
email2 = [email protected]
email3 = [email protected]
そして私はEメールを受け取りたかった2
私ができること:
grep email2 /etc/emails.conf | cut -d'=' -f2
email2を取得する方法は1つですが、sedまたはawkコマンドを1つ使用して「クーラー」にし、cutコマンドで残される空白を削除するにはどうすればよいですか。
Awkを使うのはどうですか?
awk -F = '/email2/ { print $2}' /etc/emails.conf
-F =
フィールドは「=」で区切られています
'/email2/ { print $2}'
「email2」に一致する行で、2番目のフィールドを出力します
exactは次のようになります。
_sed -n '/email2/{s/^[^=]*=\([^=]*\).*/\1/;p;}' < file
_
しかし、おそらく代わりにしたいでしょう:
_sed -n 's/^[^=]*email2[^=]*=[[:blank:]]*//p' < file
_
(つまり、最初の_email2
_の前の部分でのみ_=
_に一致し、2番目の__までの部分だけでなく、最初の_=
_(先行ブランクをスキップ)の右側にあるすべてを返します_=
_(存在する場合)。
Perl -nlE 's/email2\s*=\s*// and say' file
どこ:
Perl -nl
は、各行の...s/email2 = //
検索されたメールIDを削除し、可能であれば...say
は、現在の入力入力行を出力します\s*
ゼロ個以上のスペース([\ t\n] *と同等)grep | cut
のようなものを取得するには、sed -n s/A/B/p
を使用できます。
デフォルトでは、sed
はすべてのコマンドが処理された後にすべての行を出力します。 sed -n
を使用して、コマンドから明示的に出力しないすべての出力を無音にすることができます。
s
コマンドは、s/$FIND/$REPLACE/$FLAGS
の形式を取ります。具体的には、p
フラグは、置換が行われるたびに行を出力します。
これらを組み合わせると、簡単に一致させてカットできます。
sed -nE "s/email2 = (.+)/\1/p" < /etc/emails.conf
実際、任意の置換パターンを使用できるため、これはgrep | cut
よりも厳密に強力です。
(-E
オプションは最新の正規表現を有効にします。これにより、置換パターンでキャプチャグループを参照できます。単純なカットの場合は、より巧妙なパターンを使用することで、それなしで回避できます。)
フィールドセパレータを「=」などの特別な値に設定する必要はありません。デフォルトでは、AWKは連続するスペースとタブをフィールドセパレーターとして使用しますが、スキップされます。そのため、ファイルの各行は3つのフィールドを持つものとして解釈され、フィールド3に先行スペースはありません。
awk '/^email2/ { print $3 }'
作り出す
[email protected]
上記は、email2
のように、email20
で始まるすべての行にも一致します。
awk '$1 == "email2" { print $3 }'