正規表現パターンの場合、&&論理演算子はawkでは機能しません。

正規表現パターンの場合、&&論理演算子はawkでは機能しません。

少し奇妙に見えるのは、&&の論理演算子が||の論理演算子とは異なり、awk if正規表現パターンでは機能しないことです。効果がある!
注:しかし、&&論理演算子は純粋で単純なawk正規表現モードで動作しますが、その理由は何ですか?

# 
# 
# cat /etc/passwd|awk '$0 ~/[Ss]ystem/ || /puls/ {print $0}'
dbus:x:81:81:System message bus:/:/sbin/nologin
pulse:x:497:495:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
# 
# 
# 
# cat /etc/passwd|awk '$0 ~/[Ss]ystem/ &&  /puls/ {print $0}'
pulse:x:497:495:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
# 
# 
# 
# cat /etc/passwd|awk '$0 ~/[Ss]ystem|puls/ {print $0}'
dbus:x:81:81:System message bus:/:/sbin/nologin
pulse:x:497:495:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
# 
# 
# 
# cat /etc/passwd|awk '{k1[NR]=$0}END{for(i=1;i<=NR;i++)if(k1[i] ~/[Ss]ystem/ || /puls/){print k1[i]}}'
dbus:x:81:81:System message bus:/:/sbin/nologin
pulse:x:497:495:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
# 
# 
# cat /etc/passwd|awk '{k1[NR]=$0}END{for(i=1;i<=NR;i++)if(k1[i] ~/[Ss]ystem/ && /puls/){print k1[i]}}'
# 
# 
# cat /etc/passwd|awk '{k1[NR]=$0}END{for(i=1;i<=NR;i++)if(k1[i] ~/[Ss]ystem/ && /puls/){print k1[i]}}'
# 
# 
# cat /etc/passwd|awk '$0 ~/[Ss]ystem/ &&  /puls/ {print $0}'
pulse:x:497:495:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
# 
# 


今少し変わったので、最近の状況は以前よりも奇妙になる可能性があります!
配列変数と論理演算子&&を持つ以下の同じ正規表現パターンが機能するのはなぜですか?
注:正規表現パターンが少なくとも配列変数自体と関連していない場合は、問題のいくつかを説明する必要があります。
# 
# 
# cat /etc/passwd|awk '{k0[NR]=$0;if(k0[NR] ~/[Ss]ystem/ && /puls/){print k0[NR]}}'
pulse:x:497:495:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
# 
# 
# cat /etc/passwd|awk '{k0[NR]=$0;if(k0[NR] ~/[Ss]ystem/ || /puls/){print k0[NR]}}'
dbus:x:81:81:System message bus:/:/sbin/nologin
pulse:x:497:495:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
# 
# 
# cat /etc/passwd|awk '{k0[NR]=$0;if(k0[NR] ~/[Ss]ystem/ && /puls/){print k0[NR]}}'
pulse:x:497:495:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
# 
# 

ベストアンサー1

最初の部分では

$0 ~/[Ss]ystem/ &&  /puls/

暗黙的です

$0 ~/[Ss]ystem/ && $0 ~ /puls/

だから

if(k1[i] ~/[Ss]ystem/ && /puls/)

次のように書く必要があります。

if(k1[i] ~/[Ss]ystem/ && k1[i] ~ /puls/)
  • 前者の場合(*)がの最後の行と一致する可能性/pusl/が高いです。/etc/passwd
  • また参照してください。man awkただし、~(および!~)が優先されます。&&

(*)OK、PulseAudio ラインを最後のラインに移動するとマッチングが完了します。

おすすめ記事