Насколько я знаю, этого нельзя добиться простой командой ps
с параметрами. Однако вы можете использовать некоторые текстовые процессоры, такие как awk
, и заставить их делать то, что вы хотите :
ps afu | awk 'NR>1 {$5=int($5/1024)"M";}{ print;}'
Это берет результат из ps
, а затем для каждой строки, кроме первой, он заменяет 5-й столбец, который обычно находится в KB, на MB, добавляя суффикс M.
Вы можете сделать его псевдонимом и сохранить в .bashrc файле, чтобы вы могли вызывать его как-то вроде myps
.
Большинство людей спрашивают, как сохранить формат или использовать другие единицы измерения и точность.
Для простой версии можно использовать column -t
выходной фильтр:
ps afu | awk 'NR>1 {$5=int($5/1024)"M";}{ print;}' | column -t
Это, однако, неправильно распознает пробелы в последнем столбце. К сожалению, нам приходится иметь дело с форматированием текста и подготавливать собственную строку формата в формате printf
-.
ps afu | awk 'NR==1 {o=$0; a=match($0,$11);}; NR>1 {o=$0;$5=int(10*$5/1024)/10"M";}{ printf "%-8s %6s %-5s %-5s %9s %9s %-8s %-4s %-6s %-5s %s\n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, substr(o, a);}'
Пояснение:
NR==1
условие только для первой строки (заголовок ). Мы используем исходный вывод ps, чтобы определить, где начинается COMMAND :. o=$0
сохраняет всю строку без изменений, чтобы мы могли использовать ее позже a=match($0,$11)
находит местоположение 11-го поля (, которое должно быть там, где столбец COMMAND начинается в исходном выводе)NR>1
для следующих строк (данные ). Меняем 5-е поле :$5=int(10*$5/1024)/10"M"
изменяет значение на мегабайты с одним десятичным знаком и добавляет суффикс «M». %-10s
означает s
для строки, 10
для 10 символов шириной, -
для выравнивания по левому краю %8s
означает s
для строки, 8
для ширины 8 символов, и из-за отсутствия -
вывод этого поля выравнивается по правому краю -.substr(o, a)
берет подстроку исходной строки (, поэтому o
хранится до ), начиная с позиции a
, рассчитанной в предыдущем условии, поэтому мы можем отображать вывод команды с сохранением пробелов. Prueba esto:
find /data/my_project -type f -name '*.php' -exec \
bash -c 'grep -q AAA "$1" && ! grep -q BBB "$1" && echo "$1"' -- {} \; \
> /tmp/class_list.txt
Encontrar todos los archivos normales con nombres de archivo que coincidan con *.php
en o por debajo de /data/my_project
que contengan AAA
pero no BBB
y almacenar sus nombres de ruta en/tmp/class_list.txt
:
find /data/my_project -type f -name '*.php' \
-exec grep -qF 'AAA' {} ';' \
! -exec grep -qF 'BBB' {} ';' \
-print >/tmp/class_list.txt
find
+awk
solución:
find /data/my_project -type f -name "*.php" -exec \
awk '/AAA/{ a=1 }/BBB/{ b=1 }END{ exit (!a || (a && b)) }' {} \; -print > /tmp/class_list.txt
find.... -name '*.php' \
-exec awk -v RS="\0" '/AAA/ && !/BBB/{print FILENAME}' {} \; > out