Распечатайте определенные слова/числа через команды grep/cut

У меня есть файл test.txt, который содержит следующий результат:

service_name1= apple/ball/cat/dog/egg/12.34.56/ball/apple
service_name2= fan/girl/house/ice/joker/23.45.67/fan/girl

и так далее до service_name1500

Я хочу вывод как:

egg 12.34.56
joker 23.45.67

и так далее: номер версии наряду со словом перед этим.

7
задан 23 November 2016 в 05:28

6 ответов

Это должно быть простым cut задание:

cut -d/ -f5,6 --output-delimiter=" "
  • -d/ наборы входной разделитель как /
  • -f5,6 выводы только 5-е и 6-е поле
  • --output-delimiter=" " устанавливает выходной разделитель как пространство
<час>

, То же самое с awk, awk значением по умолчанию устанавливает выходного разделителя полей как пространство:

awk -F/ '{print $5,$6}'
<час>

Пример:

% cat file.txt
service_name1= apple/ball/cat/dog/egg/12.34.56/ball/apple
service_name2= fan/girl/house/ice/joker/23.45.67/fan/girl

% cut -d/ -f5,6 --output-delimiter=" " file.txt
egg 12.34.56
joker 23.45.67

% awk -F/ '{print $5,$6}' file.txt
egg 12.34.56 
joker 23.45.67
10
ответ дан 23 November 2019 в 06:09

sed решение (работает, последовательно ли полевое положение строки версии или нет, но форма строки версии, должно быть единым)

$ sed -r 's#.*/(.*)/([0-9]{2}\.[0-9]{2}\.[0-9]{2}).*#\1 \2#' test.txt
egg 12.34.56

joker 23.45.67

Объяснение

  • -r использование ДО, таким образом, мы не должны выходить (), метасимволы
  • s#old#new# находят шаблон old и замена new
  • .* соответствие, которое любой или никакие символы в этом положении
  • (stuff) помнят stuff за более поздний
  • [0-9]{2}\.[0-9]{2}\.[0-9]{2} шаблон [2 цифры]. [2 цифры]. [2 цифры]
  • \1 \2 два помнивших шаблона с пространством, промежуточным
8
ответ дан 23 November 2019 в 06:09

Это сделает это:

cut -d'/' -f5-6 test.txt | tr -s "/" " "
5
ответ дан 23 November 2019 в 06:09

Если бы Вы имеете дело с фиксированными положениями слова, это работало бы:

grep -e 'service_name[0-9]*=' test.txt|awk -F'/' '{ print $5" "$6 }'
3
ответ дан 23 November 2019 в 06:09
$sed -r 's/.*\/([[:alpha:]]+)\/([\.0-9]*)\/.*/\1 \2/' test.txt

Объяснение:

  • .* вначале и конец сокращает все символы, которые не соответствуют следующему
  • ([[:alpha:]]+), первая подгруппа в скобках соответствует только алфавитным символам
  • \/ соответствия наклонная черта, которая будет отключена
  • следующая подгруппа ([\.0-9]*) числа соответствий и точки и хранит ее во втором регистре
  • после того, как единственная наклонная черта / прибудет, замена с \1 \2 вставляет первый и второй регистр от подобранных подгрупп
2
ответ дан 23 November 2019 в 06:09

Длинный, но работающий однострочный Python:

$ python -c "import sys;print '\n'.join([ ' '.join(l.strip().split('/')[4:6]) for l in sys.stdin])" < input.txt          
egg 12.34.56
joker 23.45.67

Как это работает:

  • перенаправить входной файл с < в поток stdin Python
  • использовать понимание списка [item for item in sequence], чтобы читать строку за строкой
  • .split() позволяет разбить строки на список слов, используя / в качестве разделителя
  • извлекать слова 4 и 5 ([ 4: 6] подразумевает, что последнее число не включено), и сделайте из них строку, используя ' '.join()
  • , составив список нужных нам строк, превратите их в строки, используя '\n'.join(), и напечатайте все это из
1
ответ дан 23 November 2019 в 06:09

Другие вопросы по тегам:

Похожие вопросы: