Intereting Posts

grep несколько строк, подсчет строк, эхо-выход для каждой строки

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

data/directory1/file1.xml data/directory2/file2.xml data/directory3/file3.xml ... 

Есть тысячи подкаталогов в данных /, каждый с одним XML-файлом.

Я хотел бы рекурсивно сканировать данные / и искать три шаблона, а затем эхо счетчик соответствия шаблону (в идеале) с меткой перед каждым. Итак, для моего вывода я бы хотел увидеть

 Pattern 1 = 20 Pattern 2 = 100 Pattern 3 = 432 

Я смог использовать это, чтобы запускать их по одному, используя:

 grep -E -r 'Pattern 1' data/ | wc -l grep -E -r 'Pattern 2' data/ | wc -l grep -E -r 'Pattern 3' data/ | wc -l 

Теперь я пытаюсь поместить все это в сценарий оболочки с одним аргументом, который будет родительским каталогом данных /. Затем выведите счетчик на каждый шаблон либо на стандартный вывод, либо на count.txt.

Ваша помощь приветствуется!

Вы должны проверить grep -c , это точно то, что вы описываете. Если вам нужна большая гибкость, вы, вероятно, можете использовать awk . Попробуйте что-то вроде этого (напечатано непосредственно в браузере и не проверено):

 dir=$1 # add tests to check if $1 exists (-d) and/or is non null (-n) find "${dir}" | awk <<\EOF BEGIN { pat1 = 0; pat2 = 0; ... } /pattern/ { pat1 += 1;} /otherpattern/ {pat2 += 2;} ... END { print "pattern", pat1; print "otherpattern", pat2; ... } EOF 

Я оставлю это для вас, чтобы выяснить детали команды find или awk скрипта.

Следующий скрипт пересекает шаблон и печатает общее количество совпадений для каждого шаблона. Он выполняет поиск в каталоге, имя которого передается в качестве аргумента, или в текущем каталоге, если вы не передадите аргумент.

 #!/bin/sh for p in 'Pattern 1' 'Pattern 2' 'Pattern 3; do printf '%s = ' "$p"; grep -E -r -e "$p" "${1:-.}/data" | wc -l done