Ваш вопрос немного искажен:
!
для представления командной строки? Это нетипично. .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
.
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);
?>
Это частый вопрос, и уже есть ответы, как это сделать, но вы можете использовать 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'
Правильный ответ::
$ awk '$1=="IdUUID:"{print $2}' file
EXTERNALLABEL
Принятый в настоящее время ответ излишне и неправильно обрабатывает строку, которую вы хотите найти, как если бы она была регулярным выражением, и поэтому этот подход потерпит неудачу, если ваша строка содержит метасимволы регулярного выражения.
Метод 1:
udiskctl monitor | awk '/IdUUID/{print $NF}'
Метод 2:
udiskctl monitor | sed -n '/IdUUID/p' | sed "s/.*://g" | sed -r "s/^\s+//g"