Sed: удалить строки без шаблона, кроме первого - PullRequest
2 голосов
/ 14 марта 2020

Как удалить строки, которые не соответствуют шаблону, кроме первой строки?

Чтобы удалить строки, кроме первой, я использую sed '1!d'

Чтобы удалить строки, которые не соответствуют шаблону, который я использую sed '/pattern/!d'

Как я могу использовать оба условия? Такие вещи, как sed '1!/pattern/!d' не работает, говорит неизвестная команда: '/'

В качестве примера (если pattern = "rcu") из ввода

  PID  PPID PRI  NI    VSZ   RSS STAT     TIME CMD
    1     0  19   0  33664  4832 Ss   00:00:07 /sbin/init splash
    2     0  19   0      0     0 S    00:00:00 [kthreadd]
    3     2  39 -20      0     0 I<   00:00:00 [rcu_gp]
    4     2  39 -20      0     0 I<   00:00:00 [rcu_par_gp]
    8     2  39 -20      0     0 I<   00:00:00 [mm_percpu_wq]
    9     2  19   0      0     0 S    00:00:04 [ksoftirqd/0]

get

  PID  PPID PRI  NI    VSZ   RSS STAT     TIME CMD
    3     2  39 -20      0     0 I<   00:00:00 [rcu_gp]
    4     2  39 -20      0     0 I<   00:00:00 [rcu_par_gp]

Спасибо

Ответы [ 4 ]

3 голосов
/ 14 марта 2020

Вывести первую строку и все строки, которые содержат rcu:

sed -n '1p; /rcu/p' file
0 голосов
/ 14 марта 2020

Если, когда вы говорите except the first, если вы имеете в виду except the first line of the input even if it doesn't match the regexp, то это то, что вы хотите:

$ awk '/rcu/ || NR==1' file
  PID  PPID PRI  NI    VSZ   RSS STAT     TIME CMD
    3     2  39 -20      0     0 I<   00:00:00 [rcu_gp]
    4     2  39 -20      0     0 I<   00:00:00 [rcu_par_gp]

или если вы имеете в виду except the first line that doesn't match the regexp, тогда это то, что вы хотите:

$ awk '/rcu/ || !c++' file
  PID  PPID PRI  NI    VSZ   RSS STAT     TIME CMD
    3     2  39 -20      0     0 I<   00:00:00 [rcu_gp]
    4     2  39 -20      0     0 I<   00:00:00 [rcu_par_gp]
0 голосов
/ 14 марта 2020

Как вы отметили awk

awk '{if ($0~/rcu/) print}' 

Демо:

$ cat file1.txt
  PID  PPID PRI  NI    VSZ   RSS STAT     TIME CMD
    1     0  19   0  33664  4832 Ss   00:00:07 /sbin/init splash
    2     0  19   0      0     0 S    00:00:00 [kthreadd]
    3     2  39 -20      0     0 I<   00:00:00 [rcu_gp]
    4     2  39 -20      0     0 I<   00:00:00 [rcu_par_gp]
    8     2  39 -20      0     0 I<   00:00:00 [mm_percpu_wq]
    9     2  19   0      0     0 S    00:00:04 [ksoftirqd/0]
$ awk '{if ($0~/rcu/) print}' file1.txt
    3     2  39 -20      0     0 I<   00:00:00 [rcu_gp]
    4     2  39 -20      0     0 I<   00:00:00 [rcu_par_gp]
$

0 голосов
/ 14 марта 2020

Вы также можете создать скрипт, который читает файл и «извлекает» первую строку, которая не соответствует шаблону (в другой временный файл или строку), выполняет другие операции, такие как удаление строк, которые вы хотите удалить, и вставьте эту строку обратно в то же место в файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...