web-dev-qa-db-ja.com

このコマンドを単純化してawkのみを使用するにはどうすればよいですか?

awk '/user/ {print $1 }' /etc/userdomains | sed 's/://'

/ etc/userdomainsの形式は

domain.tld: user
otherdomain.tld: otheruser
6
xenoterracide

最も簡単な方法は、フィールド区切り文字を「:」に設定することです。

awk -F":" '$2~/user/{print $1}' /etc/userdomains

And if you want to check for exact username, 

awk -F"[ \t]*:[ \t]*" '$2=="user"{print $1}' /etc/userdomains
9
user1606

gsubawkを使用して、文字列内のすべての:を削除できます。

awk '/user/ {gsub(":", ""); print $1}' /etc/userdomains
2
sepp2k

awkにはsub(regexp, replacement, target)関数があり、regexp(デフォルトでは$0)でtargetの最初の出現を検出し、それをreplacement(インプレース)に置き換えます。

awk '/user/ {sub(/:/, ""); print $1}' /etc/userdomains
2
Michael Mrozek

Sedの代わりにtrを使用できます。

awk '/user/ {print $1 }' /etc/userdomains | tr -d ":"

Awkを使用するよりもそれがどのように優れているかはわかりませんが(sedの何が問題になっているのかもわかりません)。

1
frabjous