При использовании расширенный или регулярные выражения 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
Все, что вам нужно, это сортировать 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 . . .