Сплит терминал выводит при сохранении пробелов - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь разделить вывод программы на фиксированную позицию. Я нашел рекомендацию awk, но мне нужно оставить пустые места в последней части вывода. Вот что мне нужно сделать:

Вывод, который я пытаюсь разделить, выглядит следующим образом:

  trace-cmd-16029 [000]  5635.254957: function:             switch_mm_irqs_off
  trace-cmd-16029 [000]  5635.254961: function:                load_new_mm_cr3
  trinity-c0-16027 [000]  5635.254961: function:             finish_task_switch
  trinity-c0-16027 [000]  5635.254963: function:             smp_reschedule_interrupt
  trinity-c0-16027 [000]  5635.254965: function:             scheduler_ipi
  trinity-c0-16027 [000]  5635.254965: function:                irq_enter
  trinity-c0-16027 [000]  5635.254965: function:                   rcu_irq_enter
  trinity-c0-16027 [000]  5635.254965: function:                   rcu_nmi_enter
  trinity-c0-16027 [000]  5635.254965: function:                sched_ttwu_pending

Мне нужно отформатировать его так:

load_new_mm_cr3
finish_task_switch
smp_reschedule_interrupt
scheduler_ipi
   irq_enter
      rcu_irq_enter
      rcu_nmi_enter
   sched_ttwu_pending

Обычно преамбула всегда заканчивается «function:», за которой следует много пустых мест. Некоторые пустые пробелы не от форматирования, а показывают вызываемые подфункции (например, пустое пространство перед "load_nw_mm_cr3" есть, потому что это подфункция "switch_mm_irqs_off"). AWK удалит все пустые места, даже те, которые мне еще нужны.

Кто-нибудь с некоторыми советами, как я могу отформатировать этот вывод в терминале?

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

Если вы не хотите жестко задавать число пробелов, а количество пробелов может быть динамическим c, попробуйте следующее.

awk '
FNR==NR{
  sub(/.*function:/,"")
  match($0,/[[:space:]]+/)
  val=substr($0,RSTART,RLENGTH)
  num=gsub(/ /,"&",val)
  a[FNR]=num
  min=min<num?min?min:num:num
  next
}
{
  if(a[FNR]-min>1){
    printf("%"a[FNR]-min"s%s\n",OFS,$NF)
  }
  else{
    print $NF
  }
}
' Input_file  Input_file

Для показанных примеров вывод будет следующим:

switch_mm_irqs_off
   load_new_mm_cr3
finish_task_switch
smp_reschedule_interrupt
scheduler_ipi
   irq_enter
      rcu_irq_enter
      rcu_nmi_enter
   sched_ttwu_pending
1 голос
/ 18 февраля 2020

Как только вы посчитаете количество пробелов между function: и именами верхнего уровня, это легко сделать с помощью sed:

$ sed 's/^.* function: \{13\}//' input.txt 
switch_mm_irqs_off
   load_new_mm_cr3
finish_task_switch
smp_reschedule_interrupt
scheduler_ipi
   irq_enter
      rcu_irq_enter
      rcu_nmi_enter
   sched_ttwu_pending

. Это просто использует s// для удаления всего постороннего к тому, что ваши результаты должны быть. \{13\} в регулярном выражении соответствует 13 пробелам (там есть начальный пробел, который ест встроенная разметка кода; но это очевидно в блоке кода).

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