2010-08-09 77 views
2

我有類似的東西之間得到的東西:shell腳本 - 如何將兩個分離

xinput --list 
⎡ Virtual core pointer      id=2 [master pointer (3)] 
⎜ ↳ Virtual core XTEST pointer    id=4 [slave pointer (2)] 
⎜ ↳ Microsoft Basic Optical Mouse    id=8 [slave pointer (2)] 
⎣ Virtual core keyboard      id=3 [master keyboard (2)] 
    ↳ Virtual core XTEST keyboard    id=5 [slave keyboard (3)] 
    ↳ Power Button        id=6 [slave keyboard (3)] 
    ↳ Power Button        id=7 [slave keyboard (3)] 
    ↳ CHICONY HP Basic USB Keyboard    id=9 [slave keyboard (3)] 

而且我想要得到的ID號。 我試過類似awk -F'id =''[print $ 2}但id號碼後面的文字仍然在這裏!我只能得到身份證號碼!

在此先感謝。

回答

1

單程

xinput --list | awk -F"id=" 'NF{split($2,a," ");print a[1]}' file 

與外殼(bash)的

#!/bin/bash 
xinput --list | while read -r line 
do 
    case "$line" in 
    *id=*) 
    line=${line##*id=} 
    echo ${line%% *} 
    esac 
done 
2

這可能不是最短的,但應該很容易理解具有的awk知識一點點的人:

awk '{ for (i = 1; i <= NF; i++) if ($i ~ /id=/) { print substr($i, 4); break; } }' 
+0

可能我建議:'{打印SUBSTR($ I,4);打破}'代替你的打印聲明 – 2010-08-09 16:33:15

+0

@glenn jackman謝謝,我添加了它。 – schot 2010-08-10 07:22:16

0

嘗試類似這樣:

xinput --list | while read line; do 
    ID=`echo ${line} | cut -d= -f2 | cut -d\[ -f1 | xargs` 
    echo ${ID} 
done 
+0

感謝它工作正常! – turlutte 2010-08-09 14:37:59

+0

不客氣:) – ozk 2010-08-09 14:51:12

2

嘗試:

xinput --list | grep -Eo 'id=[0-9]+' | grep -Eo '[0-9]+' 

xinput --list | grep -Eo 'id=[0-9]+' | awk -F= '{print $2}' 
+0

不錯的解決方案。需要使用GNU grep for -o – 2010-08-09 16:31:17

0

猛砸只:

while read line ; do 
    if [[ $line =~ id=([[:digit:]]) ]] ; then 
     echo "${BASH_REMATCH[1]}" 
    fi 
done < <(xinput --list) 
0

我覺得這些東西與SED簡單地說,使用一組替代捕獲數據你想要的,並確保其餘的行在正則表達式匹配。

​​
+0

,它將包含沒有id =的行,使用-n取消初始輸出,並在替換結尾添加ap以僅顯示替換字符串...或者xinput - - 僅列出帶有ID輸出的顯示行? – Petesh 2010-08-10 14:40:52

+0

我是以海報提供的示例文本爲基礎的,但是您對-n/p-我經常使用的另一個sed模式是正確的。 – camh 2010-08-11 00:43:48

0

嘗試:

cat x | awk -Fid= '{print $2}' | awk '{print $1}'