Еще одна возможность
Просто для полноты картины, можно попытаться найти в параллель и посмотреть, насколько хорошо операционная система кэширует файлы!
#!/bin/bash
grep -c "^ISA" file > isa.tmp &
grep -c "^IEA" file > iea.tmp &
grep -c "^ST" file > st.tmp &
grep -c "^SE" file > se.tmp &
grep -c "^GS" file > gs.tmp &
grep -c "^GE" file > ge.tmp &
wait
isa=$(cat isa.tmp)
iea=$(cat iea.tmp)
st=$(cat st.tmp)
se=$(cat se.tmp)
gs=$(cat gs.tmp)
ge=$(cat ge.tmp)
echo $isa $iea $st $se $gs $ge
Пересмотренные Ответ
Теперь, когда вы дали нам образцы поиска, могут быть и другие варианты:
#!/bin/bash
grep -E "^(ISA|IEA|ST|SE|GS|GE)" file > tmp$$
isa_count=$(grep -c "^ISA" tmp$$)
iea_count=$(grep -c "^IEA" tmp$$)
st_count=$(grep -c "^ST" tmp$$)
se_count=$(grep -c "^SE" tmp$$)
se_count=$(grep -c "^GS" tmp$$)
ge_count=$(grep -c "^GE" tmp$$)
echo $isa_count $iea_count $st_count $se_count $ge_count
Или это:
awk '
/^ISA/ {isa++;next}
/^IEA/ {iea++;next}
/^ST/ {st++;next}
/^SE/ {se++;next}
/^GS/ {gs++;next}
/^GE/ {ge++;next}
END{ print isa,iea,st,se,gs,ge}' file
Оригинальные Ответ
Да, сделать их все на одном дыхании с egrep
:
egrep "pattern1|pattern2|pattern3..." file
так:
egrep "pattern1|pattern2|pattern3..." file > tmp$$
grep -c pattern1 tmp$$
grep -c pattern2 tmp$$
Try держать поиск закрепленную в начале строки (с ^
), если это возможно.
Примечание. Я считаю, что egrep
устарел, и вместо этого мы должны использовать grep -E
.
Какие еще пять матчей? Вероятно, вы могли бы написать один awk-скрипт, чтобы сопоставить (и считать) все за один проход. –