Возврат данных до N-го появления символа X - PullRequest
0 голосов
/ 15 сентября 2011

С каталогом у меня есть несколько файлов, которые имеют несколько номеров версий в файлах.Я подбираю каждый файл в каталоге для этих номеров версий, сортирую их, чтобы получить самый последний номер версии, и затем помещаю его в «хвост -1» только для самого последнего номера версии, а не для каждого результата grep.

Данные выглядят примерно так:

файл1: мусор asdf 1.2.4.1 мусор текст asdf

файл2: мусор fsdaf asdfsda 4.3.2.10 fdsaf

и т. Д.,Я уже завершил извлечение самого последнего номера версии.Я сделал это со следующим:

grep -o '[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}' * | sort | tail -1

Следующая часть - это то, с чем у меня проблемы.Я пытаюсь извлечь число (будь то один числовой символ или два числовых символа) до первого периода и вернуть этот результат.Затем, я предполагаю, что с немного другой командой сделать то же самое, но для числа после первого периода.И снова для числа после второго периода и, наконец, после третьего периода.

У меня практически нет опыта работы с sed или awk, но после небольшого исследования я считаю, что один из этих инструментов - способ достиженияэто.

Спасибо!

Редактировать: Хорошо, я понял, но я уверен, что это можно сделать гораздо проще.У меня есть следующее:

grep -o '[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}' * | sort | tail -1 | grep -o '[0-9]\{1,\}' | sed -n 2p

или sed -n 1p, 3p, 4p в зависимости от того, какое значение я хочу.

Ответы [ 2 ]

1 голос
/ 15 сентября 2011

для получения последнего номера версии:

grep  -P -o "\d+\.\d+\.\d+\.\d+" * |sed 's/.*://g'|awk -F'.' '{v[$0]=($1"."$2$3$4)+0;}END{m=0;for(x in v)if(v[x]>m){m=v[x];n=x;}print n}' 

для извлечения чисел:

kent$  echo "10.2.30.4"|awk -F'.' -v OFS="\n" '$1=$1'    
10
2
30
4

вы можете соединить две строки вместе.

0 голосов
/ 15 сентября 2011

Чтобы извлечь номер версии, без необходимости знать, сколько в нем точек, я бы использовал

grep -o '[0-9.]\+' filename | sort --version-sort | tail -1

(при условии, что у вас есть сортировка GNU с опцией --version-sort)

Чтобы получить только основной номер версии, передайте вышеуказанное в одну из

sed 's/\..*//'
while read line; do echo ${line%%.*}; done
...