У меня есть файл
xyz... rsync: "/home/path/to/file": Permission denied (13) rsync:
"/home/path/to/file1": Permission denied (13) rsync:
"/home/path/to/file2": Permission denied (13) rsync:
"/home/path/to/file3": Permission denied (13)
Теперь я хочу извлечь только пути к файлам и сохранить их в другом файле. Выходной файл выглядит так:
/home/path/to/file
/home/path/to/file1
/home/path/to/file2
/home/path/to/file3
Используя sed или awk, как я могу это сделать?
Я пытался, sed -n '/"/,/"/p' myfile
но это не работает.
Ответы:
Вы можете передать stderr вашей команды rsync в скрипт awk:
Или к команде сокращения как это:
источник
cut -d\" -f2
"
и"
на stderr.$1
; все между первой и второй двойными кавычками есть$2
; и все после второй двойной кавычки находится в$3
($4
, ...). Имя файла (по-видимому) всегда между первыми двумя двойными кавычками, поэтому это решение должно работать (и работало, когда я его проверял).Использование
sed
:Это ищет: начало строки, серию не-кавычек, двойную кавычку, захватывает серию не-кавычек, двойную кавычку и все остальное в строке и заменяет ее захваченным материалом.
Протестируйте RHEL 5 Linux с GNU
sed
, но только с использованием функций, которые работали бы в 7-й версии UNIX ™sed
.Кстати, немного более простой способ сделать это с помощью двух замещающих команд; изменить все, вплоть до первой двойной кавычки, включая пустую строку (это последовательность из нуля или более не кавычек, за которыми следует двойная кавычка); измените все после того, что сейчас является первой двойной кавычкой, на ничто:
Кстати, команда, которую вы пробовали (`sed -n '/" /, / "/ p'), печатает из одной строки, содержащей двойные кавычки, в следующую строку, содержащую двойные кавычки, без редактирования строк вообще. Вот почему, похоже, это не сработало для вас - оно сделало то, что вы просили, но то, что вы просили сделать, было не тем, что вы намеревались просить это сделать.
С точки зрения эффективности, вряд ли будет ощутимая разница в производительности. С точки зрения простоты обслуживания, я подозреваю, что последний менее обременителен для клеток мозга.
источник
Если ваша версия
grep
поддерживает Perl-regexp:Результаты:
Вы также можете сделать это менее строгим, чтобы соответствовать чему-либо между двойными, если вы хотите:
источник
.*
не-жадным с.*?
на тот случай, если позже в строке появятся дополнительные двойные кавычки? Или использовать[^"]*
вместо.*
?Используйте оператор >>, чтобы сохранить любой вывод в файл.
подобно
Так что просто измените это для вашего конкретного сценария, используя sed, добавив
в команду
источник
grep -r
Делает рекурсивный поиск с помощью любых каталогов , перечисленных в аргументах (*
). Непонятно, какой шаблон вы имеете в виду, ноgrep
подхватите всю линию. Цель упражнения - собрать информацию из части строки. Если вы используете GNUgrep
, есть способы сделать это (-o
); они нестандартны (за исключением того, что GNU определяет стандарт де-факто). Аналогично с использованием регулярных выражений PCRE; это еще одно расширение GNU. Они хороши, если у вас есть GNUgrep
и вы не планируете работать на платформах, где GNUgrep
по умолчанию недоступна.