web-dev-qa-db-ja.com

sedまたはawkを使用した「grep | cut」に相当するものは何ですか?

設定ファイルがあるとしましょう/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コマンドで残される空白を削除するにはどうすればよいですか。

6
Peter Turner

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

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

  • '/email2/ { print $2}'「email2」に一致する行で、2番目のフィールドを出力します

4

exactは次のようになります。

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

しかし、おそらく代わりにしたいでしょう:

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

(つまり、最初の_email2_の前の部分でのみ_=_に一致し、2番目の__までの部分だけでなく、最初の_=_(先行ブランクをスキップ)の右側にあるすべてを返します_=_(存在する場合)。

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

どこ:

  • Perl -nlは、各行の...
  • s/email2 = //検索されたメールIDを削除し、可能であれば...
  • sayは、現在の入力入力行を出力します
  • \s*ゼロ個以上のスペース([\ t\n] *と同等)
3
JJoao

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オプションは最新の正規表現を有効にします。これにより、置換パターンでキャプチャグループを参照できます。単純なカットの場合は、より巧妙なパターンを使用することで、それなしで回避できます。)

0
cbarrick

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

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

作り出す

[email protected]

上記は、email2のように、email20で始まるすべての行にも一致します。

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