Для тех, кто хочет считать все экземпляры, вот 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
Не уверенный, что Вы подразумеваете под fbgs или почему Вы говорите screen
является громоздким. Но если ударом ttys Вы имеете в виду виртуальные консоли Linux, затем Вы открываетесь больше openvt
команда (раньше известный как open
).
getty
вариант, выполняющий ту консоль сначала. – peterph 28.11.2012, 12:21