Shell脚本 - 如何在两个分隔符之间获取内容

时间:2010-08-09 14:15:53

标签: bash scripting shell awk

我有类似的东西:

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)]

我想得到身份证号码。 我尝试了类似awk -F'id =''[print $ 2}的内容,但是id号后面的文字仍在这里!我怎么只能得到身份证号码?

提前致谢。

7 个答案:

答案 0 :(得分:2)

这可能不是最短的,但对于有awk知识的人来说应该很容易理解:

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

答案 1 :(得分:2)

尝试:

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

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

答案 2 :(得分:1)

单程

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

使用shell(bash)

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

答案 3 :(得分:0)

尝试这样的事情:

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

答案 4 :(得分:0)

仅限Bash:

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

答案 5 :(得分:0)

我用sed找到这些东西最简单,用组替换来捕获你想要的数据,并确保在正则表达式中匹配线的其余部分。

sed 's/.*id=\([0-9]*\).*/\1/'

答案 6 :(得分:0)

尝试:

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