2010-08-09 29 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}'