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"
Заметки
- Для тех из нас, кто придерживается иного понимания английской орфографии,
grep
позволяет как--color
а также--colour
, Чтобы избежать путаницы, я использовал первый в тексте, хотя обычно использую второй по привычке.
Спасибо всем! Я считаю, что использование grep --color= всегда было самым простым решением для моего вопроса. Другие предложения тоже сработали, но мы не обсуждали эти команды в классе. Вот мой код:
echo " $file $( ls -l "$file" | awk '{print $5}' | grep --color=always [0-9] ) $regfile "