В `dmesg | head`, (как) dmesg убивается после 10 строк вывода? [дубликат]

Использовать Sed.

Обратите внимание, что вы не будете использовать 0 индексированных позиций, а начнете с 1. Итак, я увеличил числа, которые вы указали.

Кроме того, вам нужно вернуться на передний план, поскольку после изменения первого столбца позиции столбцов изменяются. Поэтому используйте Sed следующим образом:

sed 's/./&,/6;s/./&,/4;s/./&,/3'

Пример:

$ echo dxccsbc
dxccsbc
$ echo dxccsbc | sed 's/./&,/6;s/./&,/4;s/./&,/3'
dxc,c,sb,c
$ 

  • Команда s в Sed предназначена для подстановки.
  • Выкройка . соответствует любому одиночному символу.
  • & в тексте замены означает «текст, который был найден», а запятая - это буквальная запятая.
  • Цифровой флаг после последнего / означает выполнение замены только в «n-м» совпадении в строке.

Если вы хотите быть действительно фантастическим, используйте расширение скобок Bash для создания команд Sed:

$ echo dxccsbc | sed '-es/./&,/'{6,4,3}
dxc,c,sb,c

Но это просто вишенка на торте и, вероятно, сбивает с толку, если вы не понимаете как Sed, так и Bash достаточно хорошо. :)


Если вы хотите получить список позиций из отдельного файла (как вы на самом деле показываете в своем вопросе), вы можете сделать это так:

sed -f <(sort -rn positionsfile | sed -n 's:^[1-9][0-9]*$:s/./\&,/&:p') file

Обратите внимание, что это специфично для Bash, поскольку он использует синтаксис замены процесса, отличный от POSIX. Также обратите внимание, что я сделал это довольно надежным, поскольку все, кроме фактических чисел в файле позиций (которые не начинаются с 0), будут отброшены.

Результаты тестирования:

$ cat file 
abcdefg
ABCDEFG
abcdelaksjdflkjsdflli
sdlfihsdlfkj
$ cat positionsfile 
2
15
5
7something
01
not a number
$ sed -f <(sort -rn positionsfile | sed -n 's:^[1-9][0-9]*$:s/./\&,/&:p') file
ab,cde,fg
AB,CDE,FG
ab,cde,laksjdflkj,sdflli
sd,lfi,hsdlfkj
$ 
14
19.01.2016, 09:29
1 ответ

Это зависит от буферов ОС и времени между 10-й и 11-й записью dmesg .

После того, как head запишет 10 строк, он завершится, и dmesg получит сигнал SIGPIPE , если он продолжит запись в конвейер.

В зависимости от буфера вашей ОС, dmesg часто будет записывать более 10 строк, прежде чем head поглотит их.

Чтобы увидеть, что head занял более 10 строк, вы можете использовать:

strace -f sh -c 'dmesg | head -n 10'

(Посмотрите на процесс head , посчитайте количество прочитанных ] системные вызовы.)

Чтобы увидеть, как влияет скорость записи:

strace -f sh -c "perl -le '$|++;print 1 while 1' | head -n 10"
27
27.01.2020, 19:50

Теги

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