Изменить для команды, чтобы удалить номер из конца имени файла

Учитывая предположение, что все ваши строки сформированы одинаково (или, по крайней мере, все строки, содержащие 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
1
10.09.2016, 02:19
2 ответа

Один из способов сделать это с помощью оболочки:

for f in *; do
    mv -- "$f" "${f%.key*}.key"
done
2
27.01.2020, 23:19

Предполагая, что имена файлов не содержат символов новой строки или обратной косой черты:

for f in ./*
do
  mv "$f" "$(echo "$f" | sed 's/key_.*$/key/')
done
2
27.01.2020, 23:19

Теги

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