bash awk "Mouse"という単語を含む項目を除外する方法

bash awk "Mouse"という単語を含む項目を除外する方法

次のbashコマンドは、名前にILITEK ILITEK-TPを含むすべてのデバイスのxinput IDを収集します。

name='ILITEK ILITEK-TP'
ids=$(xinput --list |awk -Fid= "/$name/"'{print $2+0}')

このスクリプトは機能します。ただし、ILITEK ILITEK-TP MouseこのID番号のリストから同様の項目を除外したいと思います。現在ILITEK ILITEK-TPILITEK ILITEK-TP Mouseアイテムが収集されますids

答え1

何かの目的を指します。

awk -Fid= "/$name/"'{print $2+0}'

よくある間違いです。

以下を行う必要があります。

awk -F'id=' -v name="$name" '$0 ~ name{print $2+0}'

しかし、ここで使用する方が良いですgrep

name='ILITEK ILITEK-TP'
xinput --list | grep -oP "${name}.*?id=\K\d+"

正規表現の一致は次のとおりです。

説明する
${name} 変数名
.*? \nを除くすべての文字(0回以上(できるだけ少なく一致))
id= 'ID='
\K KLookbehindアサーションを使用して、より短い代替方法で一致開始(ept)をリセットします。周りを見てくださいそして正規表現で\ Kをサポート
\d+ 数字(0~9)(1回以上(最大限多く一致))

答え2

以下を試すことができますgrep

xinput --list |grep 'ILITEK ILITEK-TP'|grep -v 'ILITEK ILITEK-TP Mouse'

答え3

awk にはブール値があります。したがって、いくつかの調整が可能でなければなりません。

name='ILITEK ILITEK-TP'
ids=$(xinput --list |awk -Fid= "/$name/"' && !/Mouse/{print $2+0}')

これが役に立たない場合は、xinput --list出力のいくつかのサンプルラインを提供してください。

(引用文が間違っているようで修正しました。)

関連情報