Обобщение предложений [дублировать]

Вы, вероятно, используете dnsmasq , попробуйте запустить

ps -ef | grep dnsmasq

Это должно дать вам файл конфигурации для используемого dnsmasq, затем просто посмотрите в него и посмотрите, какие DNS используются в качестве переадресации для dnsmasq .

7
19.10.2018, 09:31
5 ответов

Общий подход:

$ awk '{ count[$2]++ }
       END {
           for (name in count)
               printf("%s signed %d time(s)\n", name, count[name])
       }' <file
Harold signed 1 time(s)
Dan signed 1 time(s)
Sebastian signed 1 time(s)
Suzie signed 4 time(s)
Jordan signed 2 time(s)
Suzan signed 1 time(s)

Т. е. использовать ассоциативный массив/хэш для хранения количества просмотров определенного имени. В блоке ENDпереберите все имена и распечатайте сводку для каждого.

Для более удобного форматирования измените заполнитель %sв вызове printf()на что-то вроде %-10s, чтобы зарезервировать 10 символов для имен (по левому краю -по ширине ).

$ awk '{ count[$2]++ }
       END {
           for (name in count)
               printf("%-10s signed %d time(s)\n", name, count[name])
       }' <file
Harold     signed 1 time(s)
Dan        signed 1 time(s)
Sebastian  signed 1 time(s)
Suzie      signed 4 time(s)
Jordan     signed 2 time(s)
Suzan      signed 1 time(s)

Больше возни с выводом (, потому что мне скучно):

$ awk '{ count[$2]++ }
       END {
           for (name in count)
               printf("%-10s signed %d time%s\n", name, count[name],
                      count[name] > 1 ? "s" : "" )
       }' <file
Harold     signed 1 time
Dan        signed 1 time
Sebastian  signed 1 time
Suzie      signed 4 times
Jordan     signed 2 times
Suzan      signed 1 time
14
27.01.2020, 20:13

Это задание для awk. Для этого вам понадобится array[index]:

awk 'NF {name[$2]++} END{for (each in name) {print each " signed " name[each] " time(s)"}}' file

Jordan signed 2 time(s)
Dan signed 1 time(s)
Suzie signed 4 time(s)
Suzan signed 1 time(s)
Sebastian signed 1 time(s)
Harold signed 1 time(s)

NF— удалить лишние пустые строки. Данные хранятся в индексе и значении массива. Значения указываются с соответствующим индексом.

3
27.01.2020, 20:13

Без форматирования самое простое решение

sort|uniq -c

uniq -cподсчитывает строки и ставит перед ними префикс их количества, сортировка необходима для работы uniq.

$ sort|uniq -c
asdf
asdf
qwer
[ctrl-d]
      2 asdf
      1 qwer

Ваше форматирование может быть выполнено с помощью sed или awk, если вам нужен именно этот формат:

awk '{print $2}'|sort|uniq -c|awk '{print($2, "signed",$1, "time(s)")}'
0
27.01.2020, 20:13

Я попробовал решение «для», хотя уверен, что его можно -отредактировать и сделать модным. Хотя служит цели.

for name in $(awk '{print $2}' x.txt)
do
count=$(grep -i $i x.txt|wc -l)
echo "$i signed in $count times" >>xy.txt
done

sort -u xy.txt

Dan signed in 3 times
Harold signed in 1 times
Jordan signed in 2 times
Sebastian signed in 1 times
Suzan signed in 1 times
Suzie signed in 4 times
-1
27.01.2020, 20:13

Хотя awkиспользует связанный массив и это будет ограничено размером имеющейся у вас памяти, вместо этого вы можете сделать следующее:

sort -k2,2 infile | uniq -c

Либо делать форматирование как хотите:

sort -k2,2 infile  |uniq -c |awk '{ print $3, "signed", $1, "time(s)" }'
8
27.01.2020, 20:13

Теги

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