Поиск с двумя grep (содержит И не содержит) и одним awk

Насколько я знаю, этого нельзя добиться простой командой 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».
    • printf отображает все поля в столбце -как привкус :
      • %-10sозначает sдля строки, 10для 10 символов шириной, -для выравнивания по левому краю
      • %8sозначает sдля строки, 8для ширины 8 символов, и из-за отсутствия -вывод этого поля выравнивается по правому краю -.
    • substr(o, a)берет подстроку исходной строки (, поэтому oхранится до ), начиная с позиции a, рассчитанной в предыдущем условии, поэтому мы можем отображать вывод команды с сохранением пробелов.
0
07.03.2018, 17:24
4 ответа

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
1
28.01.2020, 02:14

Encontrar todos los archivos normales con nombres de archivo que coincidan con *.phpen o por debajo de /data/my_projectque contengan AAApero no BBBy 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
4
28.01.2020, 02:14

find+awksolució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
2
28.01.2020, 02:14
find.... -name '*.php' \
   -exec awk -v RS="\0" '/AAA/ && !/BBB/{print FILENAME}' {} \; >  out
0
28.01.2020, 02:14

Теги

Похожие вопросы