У меня есть файл 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
и так далее: номер версии наряду со словом перед этим.
Это должно быть простым 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
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
два помнивших шаблона с пространством, промежуточным Это сделает это:
cut -d'/' -f5-6 test.txt | tr -s "/" " "
Если бы Вы имеете дело с фиксированными положениями слова, это работало бы:
grep -e 'service_name[0-9]*=' test.txt|awk -F'/' '{ print $5" "$6 }'
$sed -r 's/.*\/([[:alpha:]]+)\/([\.0-9]*)\/.*/\1 \2/' test.txt
Объяснение:
.*
вначале и конец сокращает все символы, которые не соответствуют следующему ([[:alpha:]]+)
, первая подгруппа в скобках соответствует только алфавитным символам \/
соответствия наклонная черта, которая будет отключена ([\.0-9]*)
числа соответствий и точки и хранит ее во втором регистре /
прибудет, замена с \1 \2
вставляет первый и второй регистр от подобранных подгрупп Длинный, но работающий однострочный 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()
позволяет разбить строки на список слов, используя /
в качестве разделителя ' '.join()
'\n'.join()
, и напечатайте все это из