grep с количеством отдельных шаблонов

При использовании расширенный или регулярные выражения Perl, grep может взять несколько шаблонов поиска, разделенных каналом (|):

   -E, --extended-regexp
          Interpret  PATTERN  as  an extended regular expression (ERE, see
          below).  (-E is specified by POSIX.)

   -P, --perl-regexp
          Interpret  PATTERN  as  a  Perl  regular  expression  (PCRE, see
          below).  This is highly experimental and grep  -P  may  warn  of
          unimplemented features.

Это означает, что Вы не должны объявлять массив для своего kewords, можно просто объединить их в единственную строку, разделенную |. Это делает Ваш сценарий намного легче:

#!/usr/bin/env bash

wget --no-clobber -r -E -e robots=off -U mozilla -R gif,jpeg,tif,jpg,pdf,bmp,png,css,js http://www.url.com

KEYWORDS='dolphins|fish|dogs|cats|iguanas'

for file in **; do
    if [[ -r "$file" ]] && [[ -f file ]] ! grep -wqP "$KEYWORDS" "$file"; then
          rm -f "$file" 
    fi
done
2
13.04.2017, 15:36
2 ответа

Попробуйте

sort macadd | uniq -c
1
27.01.2020, 22:05

Все, что вам нужно, это сортировать macadd | uniq -c, как объяснил @roaima, но я просто хотел указать, как вы можете сделать это, используя тот же подход, который вы пытались.

Нет причин для grep через файл, вы можете просто передать его прямо в , в то время как :

while read mac; do echo "$mac"; done < macadd

Кроме того, grep имеет опцию -c, которая подсчитывает совпадения. Таким образом, с помощью пары небольших изменений вы можете сделать то, что пытались сделать с помощью используемых инструментов:

$ while read mac; do 
    printf "%5s\t%s\n" $(grep -c "$mac" macadd) "$mac"; 
  done < <(sort -u macadd)
   6     00:EE:BD:A2:4A:E1
   3     10:AE:60:5A:72:7A
   6     28:47:AA:C8:1C:88
   2     34:C0:59:B3:68:DC
  10     4C:3C:16:55:CD:6A
1415     4C:7F:62:31:0C:D0
   1     50:CC:F8:BA:10:D7

Теперь, ваш grep не работает, потому что : не считается символом слова, поэтому не совпадает с \w. Вместо этого вы могли бы использовать нечто подобное:

grep -ohE '[A-Z0-9:]+' macadd | sort -u 

, но в grep нет необходимости, так как sort может сделать это самостоятельно (всегда предполагая, что в вашем файле нет ничего, кроме MAC-адресов):

sort -u macadd | while read . . .
2
27.01.2020, 22:05

Теги

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