У меня есть следующая строка
Device Enabled (126): 1
Могу ли я извлечь в переменную VAR только 126 и НЕ (126)?
пс 126 = случайное число
, пожалуйста, помогите мне!
РЕДАКТИРОВАТЬ Я вставляю свой сценарий, чтобы вы могли понять решение
ID=`xinput list | grep -i TouchPad | awk -F= '{ print $2}' | awk '{print $1}'`
VALOREENABLE=`xinput list-props $ID | grep -i Enabled |awk '{print $3}'`
VALORESENSE=`xinput list-props $ID | grep -i Profile |awk '{print $3}'
в моем случае VALOREENABLE = (126) и VALORESENSE (256) я хочу 126, только 256 без (): (`
Есть много способов сделать это. Вот тот, который первым приходит мне на ум:
VALOREENABLE=`xinput list-props $ID | grep -i Enabled | grep -o "(.*)" | tr -d '()'`
VALORESENSE=`xinput list-props $ID | grep -i Profile | grep -o "(.*)" | tr -d '()'`
Хорошо, я добавлю 2c, вы можете сделать это напрямую с помощью awk.
ID=`xinput list | grep -i TouchPad | awk -F= '{ print $2}' | awk '{print $1}'`
VALOREENABLE=`xinput list-props $ID | awk '/Enabled/ {print substr ($3, 2, 3) }'`
VALORESENSE=`xinput list-props $ID | awk '/Profile/ {print substr ($3, 2, 3) }'
В одну сторону, используя sed
:
sed 's/.*(\([^)]*\)).*/\1/' <<<"Device Enabled (126): 1"
Результат:
126
, поэтому для своего сценария вы можете попробовать:
#!/bin/bash
ID=`xinput list | grep -i TouchPad | awk -F= '{ print $2}' | awk '{print $1}'`
VALOREENABLE=`xinput list-props $ID | grep -i Enabled |awk '{print $3}'`
#VALORESENSE=`xinput list-props $ID | grep -i Profile |awk '{print $3}'`
VALORESENSE=`xinput list-props $ID | grep -i Profile | awk '{print $4}' | sed 's/.*(\([^)]*\)).*/\1/' `
echo $VALORESENSE
echo "Device Enabled (126): 1" | grep -P -o "[0-9]+" | head -1
-P
включает PEARL-подобное поведение (которое позволяет вам использовать +
), а -o
говорит grep выводить только совпадающую часть строки. Каждое совпадение будет напечатано на новой строке head -2
. Извлечение идентификатора может быть упрощено следующим образом (обратите внимание на использование $()
вместо обратных кавычек):
ID=$(xinput list | awk '/TouchPad/{sub(/^.*id=/,"");sub(/\[.*/,"");print}')
Лично я бы использовал perl
при извлечении чисел:
VALOREENABLE=$(xinput list-props $ID | perl -ne 's/.*\((.*)\).*/$1/ and print if /Enabled/' )
VALORESENSE=$(xinput list-props $ID | perl -ne 's/.*\((.*)\).*/$1/ and print if /Profile/' )
Оболочка может сделать это:
str="Device Enabled (126): 1"
old_IFS=$IFS
IFS="()"
words=($str)
number=${words[1]}
Или, если Вы действительно любите использовать awk, устанавливаете разделителя полей, чтобы быть любой круглой скобкой
number=$(awk -F '[()]' '{print $2}' <<< "Device Enabled (126): 1")
Используя Ваш пример кода, я записал бы:
ID=$(xinput list | awk -F= '/TouchPad/ {split($2, a, /[[:space:]]\+/); print a[1]}')
PROPS=$(xinput list-props $ID)
VALOREENABLE=$(awk -F '[()]' '/Enabled/ '{print $2}' <<< "$PROPS")
VALORESENSE=$(awk -F '[()]' '/Profile/ '{print $2}' <<< "$PROPS")