Организуйте записи в виде электронной таблицы (csv) с помощью awk

Какая часть Вашего веб-сервера даже делает поиски DNS? Большинство конфигураций веб-сервера явно отключает обратный поиск DNS каждого входящего пользователя для скорости (потому что DNS является медленным в целом).

Как Patrick отмечает, nscd делает правильную вещь и уважает положительные значения TTL. Да, Вы могли переопределить его (unbound позволил бы Вам сделать это легко, просто изменить server.cache-min-ttl, имеет предупреждения об увеличении его вне 1 часа по тем же причинам). ОДНАКО Ваши запросы, вероятно, главным образом rDNS, который будет иметь тенденцию иметь дольше TTLs в целом.

Кроме того, начиная с Вашего maximum number of cached values является настолько низким, я хотел бы отметить, что Вы едва получаете любой трафик.

Если Вы действительно заботитесь о том, где Вы, которых пользователи часто повторяют от того, я предложил бы регистрировать его снаружи nscd и не вызвать беспокойство о нем больше.

Редактирование (2013/12//09): nscd -g статистика хостов от dev.gentoo.org (никакие блоки в комментариях):

nscd configuration:
 4h  8m 43s  server runtime
hosts cache:
        yes  cache is enabled
         no  cache is persistent
         no  cache is shared
        422  suggested size
    1108744  total data pool size
     966632  used data pool size
        600  seconds time to live for positive entries
         20  seconds time to live for negative entries
      67878  cache hits on positive entries
       2479  cache hits on negative entries
       9464  cache misses on positive entries
       4276  cache misses on negative entries
         83% cache hit rate
       6951  current number of cached values
       7641  maximum number of cached values
         33  maximum chain length searched
          1  number of delays on rdlock
          0  number of delays on wrlock
          0  memory allocations failed
        yes  check /etc/hosts for changes
3
08.08.2015, 23:35
3 ответа
awk '
BEGIN {
    fmt="%-15s%-10s%-10s%-10s%-10s%-10s\n"
    printf fmt,"Name","Age","Sex","Weight","Home","Phone"
    print "---------"
}

{
    v=$0
    sub(/[^:]*: /, "", v)
    a[$1]=v
}

/Phone/ {
    printf fmt,a["NAME:"],a["Age:"],a["Sex:"],a["Weight:"],a["Home"],a["Phone"]
    delete a
}

END{ 
    print "---------\nFile Complete" 
}' file*

Использование двойных табуляций между столбцами проблематично. Если есть, скажем, и длинные, и короткие имена, тогда столбцы могут оказаться в неправильных местах.Выше я отформатировал столбцы заданной ширины. Возможно, вам придется отрегулировать ширину для достижения наилучших результатов.

Обратите внимание, что FS = ":" также может вызвать проблемы. Поля могут содержать двоеточия, что сбивает счетчик.Этого можно избежать, разбив информацию в первом двоеточии, как указано ниже. Эти операторы записывают всю информацию о файле в массив a :

v=$0
sub(/[^:]*: /, "", v)
a[$1]=v

Первое поле - это ключ. Все, что находится после первого двоеточия, является значением.

Одна команда awk может обработать множество файлов. Как и выше, обрабатываются все файлы, соответствующие файлу glob * . Замените его любым глобусом, который соответствует вашим файлам данных.

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

Пример вывода

$ bash script.sh
Name           Age       Sex       Weight    Home      Phone     
---------
Matty Nigan    65        M         XX        XXXXX     XXX XXX XXXX
---------
File Complete
2
27.01.2020, 21:27

Кроме того, похоже, что оператор, начинающийся с "{print $ 2 ...", будет выполняться для каждой входной записи. Лучше включить печать в фигурные скобки после селектора / PHONE: /. Кроме того, если бы я делал это, я бы поместил часть BEGIN в начало программы, а не встраивал бы ее дальше вниз, как есть.

Как отмечалось в предыдущем комментарии, в отпечатке следует указывать имя, возраст, пол и т. Д., А не 2, 3, 4 доллара и т. Д.

Я считаю, что / PHONE: / {phone = $ 3} даст ты проблема. Как видно из примеров данных, три группы цифр телефонного номера, разделенные пробелами, будут отображаться как $ 3 $ 4 $ 5. Таким образом, чтобы собрать весь номер телефона, более подходящим вариантом будет / PHONE: / {phone = $ 3 "-" 4 доллара США "-" 5 долларов США}.

0
27.01.2020, 21:27

Попробуйте использовать лук, построенный так, как показано ниже. Построит массив с деталями и распечатает лот в конце.

awk -F: '
/^NAME/{name[c]=$2}
/^Age:/{age[c]=$2}
/^Sex:/{sex[c]=$2}
/^Weight:/{weight[c]=$2}
/^Home address:/{home[c]=$2}
/^Phone number:/{phone[c]=$2;c++}
END {
 print "NAME         AGE   SEX   Weight HOME Phone"
 print "==========="
 for(x in name) {
  printf "%-10s %3d    %s      %s %s %s\n",
    substr(name[x],2),
    age[x],
    sex[x],
    weight[x],
    home[x],
    phone[x]
 }
}'
0
27.01.2020, 21:27

Теги

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