Учитывая предположение, что все ваши строки сформированы одинаково (или, по крайней мере, все строки, содержащие MATCH:
), кажется, что ПОИСКПОЗ:
- это 5-й элемент строки, а желаемое значение - 6-й.
Поэтому в awk вам просто нужно проверить, равен ли 5-й элемент MATCH:
, и вывести 6-й элемент строки, если он правильный.
$ echo "2017-01-19:31:51 [ABCD:] 37723 - MATCH: 10 [text]" |awk -e '{ if ($5 == "MATCH:") print $6 }'
10
РЕДАКТИРОВАТЬ: Учитывая предположение, MATCH:
может быть где угодно в строке:
$ echo "2017-01-19:31:51 [ABCD:] 37723 - MATCH: 10 [text]" |awk -e '{ for (x=1; x<NF; x++ ) { if ($x == "MATCH:") {x=x+1; printf("%s\n", $x); break}}}'
10
Может быть не очень элегантно, но вам нужно пройти через все поля строки и проверить каждое поле, которое является выполняется с помощью цикла for
и теста if
.
Если тестовое поле соответствует, то распечатайте следующее поле.
Я просто добавил разрыв, чтобы напрямую перейти к следующей строке и продолжить текущую итерацию поля.
В многострочном файле:
$ cat terst
2017-01-19:31:51 [ABCD:] 37723 - MATCH: 10 [text]
2017-01-19:31:51 [ABCD:] 37723 - MATCH: 11 [text]
2017-01-19:31:51 [ABCD:] 37723 - [text]
2017-01-19:31:51 37723 - MATCH: 12 [text]
$ awk -e '{ for (x=1; x<NF; x++ ) { if ($x == "MATCH:") {x=x+1; printf("%s\n", $x); break}}}' terst
10
11
12
Один из способов сделать это с помощью оболочки:
for f in *; do
mv -- "$f" "${f%.key*}.key"
done
Предполагая, что имена файлов не содержат символов новой строки или обратной косой черты:
for f in ./*
do
mv "$f" "$(echo "$f" | sed 's/key_.*$/key/')
done