Войдите в другой удар ttys после входа в один

Для тех, кто хочет считать все экземпляры, вот awk версия, которая будет считать несколько неперекрывающихся экземпляров, когда будет больше чем один на той же строке

ОБНОВЛЕНИЕ: Я теперь включал другой метод, который использует split(.... Это намного быстрее, чем match( substr(... метод, который теперь упоминается ниже более быстрый. split(... метод больше чем в 4 раза быстрее, чем другой... (протестированный на 87 файлах на в общей сложности 407 612 строк.
Для дальнейшего сравнения, метода Michael Mrozek, с помощью /Sync/ выбор диапазона (который считает строки containg каждым шаблоном по сравнению с подсчетом всех экземпляров шаблона) дважды с такой скоростью, как этот новый метод (для тех же данных).

Другое преимущество края (?) этого быстрее split(methos) это, это довольно терпимо к недопустимым символам UTF-8 в файле (пока они не находятся в шаблоне разделителя)... Разделители являются самостоятельно фактическими строковыми считаемыми шаблонами... Несколько из моих тестовых файлов имели недопустимый UTF-8 в них, и он взял меня долгое время для обнаружения, почему я получил различные результаты этих двух методов.
После того как проблемные файлы были повторно закодированы к допустимому UTF-8, оба метода приводят к идентичным результатам.

Вот является новый более быстрый метод (4 + времена быстрее)... использованием split(...

#!/bin/bash
pat='xx|yy|zz'
awk -v vpat="$pat" 'BEGIN { 
  split(vpat, pat, "|"); for(i in pat) pz++ 
} 
{ if (NF) { for( p in pat ) { ct[p]+=(split( $0, A, pat[p] ) -1) }}
}
END { print " count   pattern"
      for (p=1; p<=pz; p++) { printf "%6d   %s\n", +ct[p], pat[p] } 
}' file

Вот Более медленный метод. использование match( substr(...

#!/bin/bash
# Count occurrences of multiple non-overlapping string patterns
awk 'BEGIN {
  pattern[1]="xx"
  pattern[2]="yy"
  pattern[3]="zz"
}
{ for( p in pattern ) {
    LHB=0; RSTART=RLENGTH=1
    while( match( substr( $0, LHB+=(RSTART+RLENGTH-1)), pattern[p] )){
      count[p]++ 
    }
  }
} END {
  print "occurs  pattern"
  for (p in pattern) {
    printf "%6d  %s\n", +count[p], pattern[p] 
  } 
}' file

Вот входной файл

xx xx  xx
xx             yy           xx

Вывод следующие:

occurs  pattern
     5  xx
     1  yy
     0  zz
1
01.12.2012, 23:36
1 ответ

Не уверенный, что Вы подразумеваете под fbgs или почему Вы говорите screen является громоздким. Но если ударом ttys Вы имеете в виду виртуальные консоли Linux, затем Вы открываетесь больше openvt команда (раньше известный как open).

2
27.01.2020, 23:39
  • 1
    необходимо было бы остановить любого getty вариант, выполняющий ту консоль сначала. –  peterph 28.11.2012, 12:21
  • 2
    @peterph. По умолчанию openvt будет использовать первый свободный. Но если Вы хотите использовать определенный, затем да, необходимо сделать его свободным сначала. Если бы Вы не хотите getty, работающий на некоторых из тех, то необходимо было бы сказать системе не запускать тот во-первых. Уничтожение его не сделает, поскольку они настроены для перепорождения, когда они завершают. –  Stéphane Chazelas 28.11.2012, 12:33

Теги

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