Bash: список размеров файла с использованием ls, awk и grep

Я ввел следующие команды в терминале:

ls -l someFile | awk '{print $5}' | grep [0-9]

Исходя из моего понимания, ls -l печатает списки каталогов и файлов с длинным форматом (включая разрешения) в текущем каталоге, поэтому отправляет в awk (для печати нужного поля из списка, который является размером файла) и grep [0-9] дал мне нужный вывод: размер файла выделен красным.

Например: drwxr-xr-x 2 zdgx6 студенты 103 23 февраля 2017 г. delosreyes_hw1

Вывод 103 (так как это размер и шрифт красного цвета)

Однако, когда я попробовал это на моем скрипте Bash, вот так: echo " $file size: $( ls -l "$file" | awk '{print $5}' | grep [0-9] ) $regfile "

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

Есть идеи, почему это может быть?

3 ответа

echo "$(tput setaf 1)$(stat -c '%B' file.log)$(tput sgr0)"
512  

Вы не должны использовать ls чтобы разобрать детали любого файла, вы можете использовать stat вместо. Вы можете оформить stat --help проверить детали различных флагов, предоставленных stat команда. Кроме того, при этом вам не нужно использовать какие-либо дополнительные pipe питаться в awk,

Гну grep выделит соответствующую часть каждой строки, если:

  • вы предоставляете аргумент командной строки --color=always [Примечание 1] или

  • stdout является терминалом, и вы либо предоставляете аргумент командной строки --color=auto или не указывайте --color (так как auto является настройкой по умолчанию).

Бег grep внутри $(...) для того, чтобы захватить вывод как часть расширения Bash означает, что stdout будет перенаправлен на канал, который не является терминалом. Так что если вы не укажете --color=always, совпадение окраски будет отключено. Как правило, вы хотите, когда вы обрабатываете вывод grep,

Таким образом, вы можете "исправить" это с помощью --color=always вариант, но на самом деле более простое решение - отправлять коды управления цветом напрямую, так как это единственная причина, по которой вы используете grep,

Цветовые коды могут быть отправлены достаточно портативным способом, используя tput утилита, которая является частью ncurses пакет и, как правило, будет установлен в любой системе Linux/BSD. Вам понадобятся следующие коды:

tput bold    # Sets boldface (Otherwise, the colour will be washed out)
tput setaf 1 # 1 is red. 2 is green, 3 yellow, 4 blue, 5 magenta, 6 cyan and 7 white

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

tput sgr0    # Normal colour and style

Так что вы могли бы сделать, например:

echo "$file size: $(tput bold)$(tput setaf 1)$(ls -l "$file" | awk '{print $5}')$(tput sgr0) $regfile"

Если вы делаете это много, вы можете сохранить tput вывод в переменных bash:

bold_red=$(tput bold)$(tput setaf 1)
reset_col=$(tput sgr0)

echo "$file size: $(tput bold)$(tput setaf 1)$(ls -l "$file" | awk '{print $5}')$(tput sgr0) $regfile"

Вы также можете жестко кодировать типичные консольные коды, если знаете, что это такое:

printf "%s size: \033[1;31m%s\033m %s\n" "$file" "$(ls -l "$file" | awk '{print $5}')" "$regfile"

Заметки

  1. Для тех из нас, кто придерживается иного понимания английской орфографии, grep позволяет как --color а также --colour, Чтобы избежать путаницы, я использовал первый в тексте, хотя обычно использую второй по привычке.

Спасибо всем! Я считаю, что использование grep --color= всегда было самым простым решением для моего вопроса. Другие предложения тоже сработали, но мы не обсуждали эти команды в классе. Вот мой код:

 echo " $file $( ls -l "$file" | awk '{print $5}' | grep --color=always [0-9] ) $regfile " 
Другие вопросы по тегам