Подтвердить что ты не робот

Shell script: как вырезать часть строки

У меня есть строка

â   â³ eGalax Inc. USB TouchController          id=9    [slave  pointer  (2)]
â   â³ eGalax Inc. USB TouchController          id=10   [slave  pointer  (2)]

и хотел бы получить список id? Как это можно сделать с помощью sed или что-то еще?

4b9b3361

Ответ 1

Я вставил содержимое вашего примера в файл с именем so.txt.

$ cat so.txt | awk '{ print $7 }' | cut -f2 -d"="
9
10

Пояснение:

  • cat so.txt распечатает содержимое файла до stdout.
  • awk '{ print $7 }' будет печатать седьмой столбец, т.е. тот, который содержит id=n
  • cut -f2 -d"=" будет вырезать вывод шага # 2 с помощью = в качестве разделителя и получить второй столбец (-f2)

Если вы предпочитаете также получать id=, то:

$ cat so.txt | awk '{ print $7 }' 
id=9
id=10

Ответ 2

Используйте регулярное выражение, чтобы поймать номер идентификатора и заменить всю строку на число. Что-то вроде этого должно это сделать (сопоставить все до "id =", затем сопоставить любое количество цифр, а затем сопоставить остальную часть строки):

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

Сделайте это для каждой строки, и вы получите список идентификаторов.

Ответ 3

Перл-решение:

perl -nE 'say $1 if /id=(\d+)/' filename

Ответ 4

$ ruby -ne 'puts $_.scan(/id=(\d+)/)' file
9
10

Ответ 5

У вас может быть awk сделать все это без использования cut:

awk '{print substr($7,index($7,"=")+1)}' inputfile

Вы можете использовать split() вместо substr(index()).

Ответ 6

Предполагая ввод

{Anything}id={ID}{space}{Anything} 
{Anything}id={ID}{space}{Anything}

-

#! /bin/sh
while read s; do
   rhs=${s##*id=}
   id=${rhs%% *}
   echo $id # Do what you will with $id here
done <so.txt 

Или, если это всегда 7-е поле

#! /bin/sh
while read f1 f2 f3 f4 f5 f6 f7 rest
do
echo ${f7##id=}
done <so.txt

См. также

Расширение параметров оболочки