Как получить две строки (заголовок + отфильтрованный контент) в качестве вывода с помощью простой команды? - PullRequest
0 голосов
/ 12 июня 2018

Я хочу получить голову как в моем выводе.

ps  lax |head -n 1
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND

И отфильтрованная строка:

ps  lax |grep openbox |grep -v grep
0  1000  1608  1513  20   0 206408 20580 SyS_po S    ?          0:00 openbox --config-file /home/debian9/.config/openbox/lxde-rc.xml

То, что я ожидаю получить, это как две строки ниже:

F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
0  1000  1608  1513  20   0 206408 20580 SyS_po S    ?          0:00 openbox --config-file /home/debian9/.config/openbox/lxde-rc.xml

Как получить две строки (заголовок + отфильтрованный контент) как вывод с помощью простой команды?

Ответы [ 4 ]

0 голосов
/ 12 июня 2018

Ответ Эда с использованием awk плюс условие NR==1 является лучшим решением.

Для полноты позвольте мне показать использование tee и процессов замены с >(command).

Например: для отображения текущих процессов (с ps), отличных от bash , при сохранении строки заголовка ps, используйте tee вследующим образом:

$ ps | tee >(sed -n 1p) >(sed 1d | grep -v bash) > /dev/null
      PID    PPID    PGID     WINPID   TTY         UID    STIME COMMAND
     5782    2514    3792       1940  cons2    1415878 12:21:38 /usr/bin/ps
     9998       2    9708       9708  ?        1415878 12:38:41 /usr/bin/ssh-agent
$

Здесь tee перенаправляет вывод на два процесса:

  • один для отображения первой строки (первая sed -n 1p),
  • затем другой, который фильтрует первую строку (другую sed 1d) и выполняет дополнительную фильтрацию с помощью grep.

Наконец, чтобы tee не выводил исходный вывод ps, стандартный вывод перенаправляется на /dev/null

0 голосов
/ 12 июня 2018
ps lax | grep -e '^F' -e '[o]penbox'

или

ps lax | grep '^F\|[o]penbox'
0 голосов
/ 12 июня 2018

Для сложных условий вы используете awk, а не grep:

ps  lax | awk 'NR==1 || /[o]penbox/'

Обратите внимание на идиоматическое использование [o] в @Cyrus и мои ответы, так что регулярное выражение не совпадает с самой командой, поэтому выне нужно явно удалять это имя команды с помощью regexp.

0 голосов
/ 12 июня 2018

Ответ Брэндона Миллера.

 printf  "$( ps  lax |head -n 1 )\n$( ps  lax |grep openbox |grep -v grep )"

Вывод:

printf  "$( ps  lax |head -n 1 )\n$( ps  lax |grep openbox |grep -v grep )"
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
0  1000  1608  1513  20   0 206560 20840 SyS_po S    ?          0:01 openbox --config-file /home/debian9/.config/openbox/lxde-rc.xmldebian9@hwy:~$ 

Добейтесь прогресса на основе ответа Брэндона Миллера и Эда Мортона.

 printf  "$( ps  lax |head -n 1 )\n$( ps  lax |grep [o]penbox )\n"

Theвывод:

printf  "$( ps  lax |head -n 1 )\n$( ps  lax |grep openbox |grep -v grep )"
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
0  1000  1608  1513  20   0 206560 20840 SyS_po S    ?          0:01 openbox --config-file /home/debian9/.config/openbox/lxde-rc.xml
debian9@hwy:~$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...