Вопрос

Я нахожу AWK действительно полезным.Вот один пример, который я собрал для манипулирования данными.

ls | awk '{ print "awk " "'"'"'"  " {print $1,$2,$3} " "'"'"'"  " " $1 ".old_ext > " $1    ".new_ext"  }' > file.csh

Я использовал этот AWK для создания файла сценария, который переименовывал бы некоторые файлы и печатал только выбранные столбцы.Кто-нибудь знает лучший способ сделать это?Что вам больше нравится - один лайнер или хитроумные манипуляции?

Это было полезно?

Решение

книга AWK полна замечательных примеров. Их собирали для загрузки с веб-страницы Кернигана (Сейчас 404).

Другие советы

Вы можете найти несколько хороших вкладышей здесь .

Я использую это:

df -m | awk '{p+=$3}; END {print p}'

Для суммирования всего дискового пространства, используемого в системе между файловыми системами.

Много лет назад я написал хвостовой скрипт в awk:

#!/usr/bin/awk -f
BEGIN {
  lines=10
}

{
  high = NR % lines + 1
  a[high] = <*>
}

END {
  for (i = 0; i < lines; i++) {
    n = (i + high) % lines + 1
    if (n in a) {
      print a[n]
    }
  }
}

Это глупо, я знаю, но вот что с тобой делает awk. С ним очень весело играть.

Генри Спенсер написал довольно хорошую реализацию nroff на awk. Он назвал это "awf". Он также утверждал, что если бы Ларри Уолл знал, насколько мощным является awk, ему бы не пришлось изобретать perl.

Вот пара awk, которые я обычно использовал ... обратите внимание, что вы можете использовать $ 1, $ 2 и т. д., чтобы получить нужную колонку. Итак, для манипулирования кучей файлов, например, вот глупая команда, которую вы можете использовать вместо mv ...

ls -1 *.mp3 | awk '{printf("mv %s newDir/%s\n",$1,$1)}' | /bin/sh

Или, если вы смотрите на набор процессов, может быть ...

ps -ef | grep -v username | awk '{printf("kill -9 %s\n",$2)}' | /bin/sh

Довольно тривиально, но вы можете видеть, как это поможет вам. =) Большую часть вещей, которые я использовал, вы можете использовать для xargs, но, эй, кому они нужны новые запутанные команды?

Я часто использую этот скрипт для редактирования PATH и переменных окружения, похожих на пути. Использование:

export PATH=$(clnpath /new/bin:/other/bin:$PATH /old/bin:/other/old/bin)

Эта команда добавляет / new / bin и / other / bin перед PATH, удаляет / old / bin и / other / old / bin из PATH (если присутствует - ошибки нет, если отсутствует) и удаляет дубликаты записей каталога на пути.

:   "@(#)$Id: clnpath.sh,v 1.6 1999/06/08 23:34:07 jleffler Exp <*>quot;
#
#   Print minimal version of $PATH, possibly removing some items

case $# in
0)  chop=""; path=${PATH:?};;
1)  chop=""; path=$1;;
2)  chop=$2; path=$1;;
*)  echo "Usage: `basename <*> .sh` [$PATH [remove:list]]" >&2
    exit 1;;
esac

# Beware of the quotes in the assignment to chop!
echo "$path" |
${AWK:-awk} -F: '#
BEGIN       {       # Sort out which path components to omit
                    chop="'"$chop"'";
                    if (chop != "") nr = split(chop, remove); else nr = 0;
                    for (i = 1; i <= nr; i++)
                            omit[remove[i]] = 1;
            }
{
    for (i = 1; i <= NF; i++)
    {
            x=$i;
            if (x == "") x = ".";
            if (omit[x] == 0 && path[x]++ == 0)
            {
                    output = output pad x;
                    pad = ":";
            }
    }
    print output;
}'

Подсчет памяти, используемой httpd

ps -ylC httpd | awk '/[0-9]/ {SUM += $8} END {print SUM/1024}'

Или любой другой процесс, заменив httpd. Разделив на 1024, получим вывод в МБ.

Мне удалось построить эмулятор команд дерева DOS для UNIX (find + awk):

find . -type d -print 2>/dev/null|awk '{for (i=1;i< NF;i++)printf("%"length($i)"s","|");gsub(/[^\/]*\//,"--",<*>);print $NF}'  FS='/'

Пара избранных, по сути, не связанных друг с другом.Читайте как 2 разных, не связанных между собой предложения.

Простое определение номеров столбцов

:

Для тех, кто часто использует awk, как я это делаю для анализа журналов на работе, мне часто приходится выяснять, какие номера столбцов у файла.Итак, если я анализирую, скажем, файлы Apache access (некоторые образцы можно найти здесь) Я запускаю приведенный ниже скрипт для файла:

NR == 1 {
        for (i = 1 ; i <= NF ; i++)
                {
                print i "\t" $i
                }
        }
NR > 1  {
        exit
        }

Обычно я называю это "cn.awk", для 'c'column 'n'numbers.Креативно, да?В любом случае, результат выглядит следующим образом:

1   64.242.88.10
2   -
3   -
4   [07/Mar/2004:16:05:49
5   -0800]
6   "GET
7   /twiki/bin/edit/Main/Double_bounce_sender?topicparent=Main.ConfigurationVariables
8   HTTP/1.1"
9   401
10  12846

Очень легко понять, что к чему.Обычно я использую этот псевдоним на своих серверах и размещаю его повсюду.


Ссылка на поля по имени

Теперь предположим, что в вашем файле есть строка заголовка, и вы предпочли бы использовать эти имена вместо номеров полей.Это позволяет вам сделать это:

NR == 1 {
    for (i = 1 ; i <= NF ; i++)
        {
        field[$i] = i
        }
    }

Теперь предположим, что у меня есть эта строка заголовка...

metric,time,val,location,http_status,http_request

... и я хотел бы подвести итог val колонна.Вместо того чтобы ссылаться на 3 доллара, я могу ссылаться на него по имени:

NR > 1  {
    SUM += $field["val"]
    }

Главное преимущество заключается в том, что скрипт становится намного более читабельным.

Печать полей - одна из первых вещей, упомянутых в большинстве руководств по AWK.

awk '{print $1,$3}' file

Меньше известно, но не менее полезно исключить поля, что также возможно:

awk '{$1=$3=""}1' file
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top