awk — извлечь значение перед «somestring:»

Ваш вопрос немного искажен:

  • Вы используете !для представления командной строки? Это нетипично.
  • Вы говорите обо всех .txtфайлах в каталоге /data/files? Для этого нужно сказать /data/files/*.txt. Если вы имеете в виду что-то другое под /data/files *.txt, пожалуйста, объясните это.
  • >> mergedfile.txtбудет добавлять файлы к mergedfile.txt, если он уже существует. Это то, что вы хотите? Если вы хотите что-то подобное, вы должны сказать об этом в своем вопросе.

Во всяком случае, как сказано Arrow в комментарии , простое и очевидное решение — заменить |на ;,вот так:

$ cat /data/files/*.txt >> mergedfile.txt; wc -l mergedfile.txt

Примечания:

  • Как я уже говорил выше, >>добавляет файлы в mergedfile.txt, если он уже существует. Если вы хотите игнорировать (, отбросить )любое предыдущее содержимое mergedfile.txt, используйте >вместо >>.
  • Если вы собираетесь ссылаться на один и тот же файл несколько раз, вы должны делать это одинаково каждый раз. Использование относительного пути один раз и абсолютного пути в следующий раз сбивает с толку и подвержен ошибкам -. (Возможно, вы захотите что-то упростить путем присвоения имени файла переменной.)

Небольшое улучшение по сравнению с предыдущим:

$ cat /data/files/*.txt > mergedfile.txt  &&  wc -l mergedfile.txt

с &&вместо ;. Это приводит к выполнению команды wc -l. только если команда catвыполнена успешно.

Каждая из приведенных выше командных строк характеризуется как «список команд», содержащий два «конвейера» (, хотя на самом деле конвейеры не задействованы ). Если вы хотите сделать это как единый «конвейер», сделайте это:

$ cat /data/files/*.txt | tee mergedfile.txt | wc -l

который подсчитывает строки при объединении файлов, избавляя от необходимости читать выходной файл. Если вы хотите добавить к существующему mergedfile.txt, используйте tee -a.

0
21.11.2019, 12:41
4 ответа

Copyright James Daniel Marrs Ritchey. This material was created for submission at 'awk - extract value infront of "somestring:"' under the terms of the cc by-sa 4.0 (https://creativecommons.org/licenses/by-sa/4.0/legalcode), but can also be alternatively obtained from 'https://snippetly.blogspot.com/2019/12/extracting-value.html' under the terms of any of the following licenses: Comprehensible Open License 3.0 (https://jamesdanielmarrsritchey.blogspot.com/2019/06/comprehensible-open-license-30.html), MIT (https://opensource.org/licenses/MIT).

В качестве альтернативы Awk, используя PHP, вы можете извлечь часть строки со значением, разбив вывод на массив, используя разрывы строк в качестве разделителя. Затем разбейте каждое значение массива на другой массив, используя двоеточие в качестве разделителя. Затем обрежьте пробелы в начале и в конце каждого значения. Наконец, выполните проверку, чтобы убедиться, что это та запись, которую вы хотите, и если это эхо-значение.

<?php

$output = <<<'EOT'

Item1:          Value1

Item2:                     Value2

Item3:                     Value3

Item4:                  Value4

EOT;

$data = explode("\n", $output);

foreach ($data as $item){

    $result = FALSE;

    $value = explode(':', $item);

    if (trim($value[0]) === 'Item3'){

        echo trim($value[1]). "\n";

        exit(0);

    }

}

echo "Value not found.\n";

exit(1);

?>
0
28.01.2020, 03:05

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

udiskctl monitor | awk '{if (match($0,"^[[:space:]]*IdUUID:[[:space:]]*([[:print:]]+)",a)) print a[1]}'

или даже короче, как предложил @Archemar

udiskctl monitor | awk '/^[[:space:]]*IdUUID:/ {print $2}'

или, более надежный вариант, предложенный @Ed Morton:

udiskctl monitor | awk '$1=="IdUUID:"{print $2}'

И, конечно, старый добрыйsed:

udiskctl monitor | sed -e 's/^[[:space:]]*IdUUID:[[:space:]]*//;t;d'
1
28.01.2020, 03:05

Правильный ответ::

$ awk '$1=="IdUUID:"{print $2}' file
EXTERNALLABEL

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

1
28.01.2020, 03:05

Метод 1:

udiskctl monitor | awk '/IdUUID/{print $NF}'

Метод 2:

udiskctl monitor | sed -n '/IdUUID/p' | sed "s/.*://g" | sed -r "s/^\s+//g"
-2
28.01.2020, 03:05

Теги

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