UNIX BASH: извлечение числа из строки - PullRequest
3 голосов
/ 25 августа 2010

Вероятно, это очень простой вопрос для опытного человека с UNIX, однако я пытаюсь извлечь число из строки и получить неправильный результат.

Это строка:

8962 ? 00:01:09 java

Это вывод, который я хочу

8962

Но по какой-то причине я продолжаю получать ту же самую точную строку обратно.Это то, что я пробовал

pid=$(echo $str | sed "s/[^[0-9]{4}]//g")

Если кто-нибудь может мне помочь, это будет оценено.

Ответы [ 6 ]

11 голосов
/ 26 августа 2010

Существует более одного способа снять кожу с кошки:

pti@pti-laptop:~$ echo 8962 ? 00:01:09 java | cut -d' ' -f1
8962
pti@pti-laptop:~$ echo 8962 ? 00:01:09 java | awk '{print $1}'
8962

cut разрезает строку в разных полях на основе разделителя или только байтовых диапазонов и часто используется в этих задачах.

awk - более старый язык программирования, особенно полезный для выполнения операций по одной строке за раз.

3 голосов
/ 26 августа 2010

Pure Bash:

string='8962 ? 00:01:09 java'
pid=${string% \?*}

Или:

string='8962 ? 00:01:09 java'
array=($string)
pid=${array[0]}
3 голосов
/ 26 августа 2010

Оболочка, не нужно вызывать внешние инструменты

$ s="8962 ? 00:01:09 java"
$ IFS="?"
$ set -- $s
$ echo $1
8962
2 голосов
/ 26 августа 2010

Чистый Баш:

string="8962 ? 00:01:09 java"

[[ $string =~ ^([[:digit:]]{4}) ]]

pid=${BASH_REMATCH[1]}
2 голосов
/ 26 августа 2010

Я думаю, это то, что вы хотите:

pid=$(echo $str | sed 's/^\([0-9]\{4\}\).*/\1/')
1 голос
/ 26 августа 2010

/^[0-9]{4}/ соответствует 4 цифрам в начале строки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...