Удалите косую черту с конца связанного вывода grep и awk, выведите эхо на консоль

Вот мой входной файл:

/home/sites/default/files/Maple%20board02%2019%2013%20.pdf
/home/sites/default/files/paintgrade/side-view.jpg
/home/sites/default/files/paintgrade/steps_2.jpg
/home/sites/default/files/Front%20sill-photo1.gif
/home/sites/default/files/Rear%20steps%20Feb.%209.2011.pdf

Вот мой оператор grep/awk:

grep /files/ 404s.txt | awk -F '/' '{print $6"/"$7}'

Вывод из этого оператора:

Maple%20board02%2019%2013%20.pdf/
paintgrade/side-view.jpg
paintgrade/steps_2.jpg
Front%20sill-photo1.gif/
Rear%20steps%20Feb.%209.2011.pdf/

(Видите косую черту в конце? Иногда она есть, иногда нет. Иногда нет подкаталога, и мой оператор awk тем не менее печатает «/».)

В другом посте я видел, как убрать косую черту в конце, но не знаю, как применить ее здесь. В сообщении говорилось, что ${1%/} даст вам строку без косой черты. Сообщение находится здесь. Ответ с наибольшим количеством голосов: target=${1%/}

Я хотел бы добавить что-то к моему оператору grep/awk, чтобы вывод был:

Maple%20board02%2019%2013%20.pdf
paintgrade/side-view.jpg
paintgrade/steps_2.jpg
Front%20sill-photo1.gif
Rear%20steps%20Feb.%209.2011.pdf

Что я могу добавить к исходному заявлению, чтобы результат был таким, как указано выше? Может быть, cut может помочь, или мой awk можно настроить так, чтобы он не печатал завершающий «/»?


person harperville    schedule 28.10.2014    source источник
comment
Вы пытаетесь распечатать все, что не /home/sites/default/files/ по этим путям? Потому что это окольный способ сделать это. И ваша проблема в том, что иногда имя файла — это поле $6, а иногда — поле $7. Когда это поле $7, вы не получаете завершающую косую черту. Когда это поле $6, вы получаете filename/, потому что $7 пусто.   -  person Etan Reisner    schedule 28.10.2014
comment
Да. Это должно сработать.   -  person harperville    schedule 28.10.2014


Ответы (2)


Чтобы удалить только этот префикс, сработает что-то вроде этого (замените строку, а затем используйте шаблон правды, чтобы получить действие печати по умолчанию).

awk '{sub("^/home/sites/default/files/", "")}7'

Если вам нужно удалить поля X из начала строки, то использование cut обычно делает это проще, чем awk.

cut -d/ -f6-
person Etan Reisner    schedule 28.10.2014
comment
Это тоже ново для меня. Спасибо! - person harperville; 28.10.2014

Проблема в том, что если нет $7, то в конце появляется косая черта. Вот быстрое решение:

$ grep /files/ 404s.txt | awk -F/ '{s=$6} NF==7 {s=s"/"$7} {print s}'
Maple%20board02%2019%2013%20.pdf
paintgrade/side-view.jpg
paintgrade/steps_2.jpg
Front%20sill-photo1.gif
Rear%20steps%20Feb.%209.2011.pdf

В более общем случае, если есть вероятность наличия более глубоких каталогов, чем paintgrade, используйте:

$ grep /files/ 404s.txt | awk -F/ '{s=$6; for (i=7;i<=NF;i++) {s=s"/"$i}} {print s}'

Кроме того, отдельный процесс grep не нужен:

awk -F/ '!/\/files\//{next} {s=$6; for (i=7;i<=NF;i++) {s=s"/"$i}} {print s}' 404s.txt

Более общее, но более простое решение: используйте sed

Это заменяет команды grep и awk:

sed -n 's|.*/files/||p' 404s.txt
person John1024    schedule 28.10.2014
comment
Я ценю этот ответ, потому что он представил некоторые дескрипторы awk, которых я не видел. Но @Etan прибил это. Спасибо! - person harperville; 28.10.2014