Нужна помощь в экранировании из кавычек awk в скрипте bash

#bash #awk #watch

#bash #awk #Смотреть

Вопрос:

У меня есть псевдоним в моем файле bashrc, который выводит текущее содержимое папки и доступное системное хранилище, постоянно обновляемое функцией просмотра.

 alias wtch='watch -n 0 -t "du -sch * -B 1000000 2>/dev/null | sort -h amp;amp; df -h -B 1000000| head -2 | awk '{print $4}'"'
  

Строка работала нормально, пока я не вставил часть awk. Я знаю, что мне нужно избегать одинарных кавычек, оставаясь при этом в двойных кавычках и $ 4, но я не смог заставить это работать. Что я делаю не так?

Это ошибка, которую я получаю

 -bash: alias: $4}": not found
  

Ответ №1:

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

 wtch() {
    watch -n 0 -t "du -sch * -B 1000000 2>/dev/null | sort -h amp;amp; df -h -B 1000000| head -2 | awk '{print $4}'"
}
  

Это очень похоже на проблему 2 в BashFAQ / 050

Кроме того, небольшая вещь, но вы можете пропустить head процесс в конце и просто awk сделать это, даже выйдя после второй строки, например

 wtch() {
    watch -n 0 -t "du -sch * -B 1000000 2>/dev/null | sort -h amp;amp; df -h -B 1000000| awk '{print $4} NR >= 3 {exit}'"
}
  

Комментарии:

1. @EdMorton Еще раз спасибо, Эд! Я принял ваше предложение (в основном), как обычно

Ответ №2:

В этом случае вы можете использовать cut вместо awk . И у вас будет тот же эффект.

 alias wtch="watch -n 0 -t 'du -sch * -B 1000000 2>/dev/null | sort -h amp;amp; df -h -B 1000000| head -2 | cut -d  -f4'"
  

Объяснение cut :

 -d option defines a delimiter
-d  means that my delimiter is space
-f selects a column
-f4 gives you the fourth column