Лучшие команды Awk - PullRequest
       29

Лучшие команды Awk

2 голосов
/ 08 ноября 2008

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

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

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

Ответы [ 12 ]

6 голосов
/ 08 ноября 2008

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

4 голосов
/ 09 января 2009

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

2 голосов
/ 11 января 2009

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

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

{
  high = NR % lines + 1
  a[high] = $0
}

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

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

2 голосов
/ 08 января 2009

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

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

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

1 голос
/ 08 ноября 2008

Я часто использую этот скрипт для редактирования 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 $"
#
#   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 $0 .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;
}'
1 голос
/ 08 ноября 2008

Вот пара 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, но, эй, кому они нужны, новые запутанные команды?

1 голос
/ 08 ноября 2008

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

0 голосов
/ 05 августа 2016

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

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

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

awk '{$1=$3=""}1' file
0 голосов
/ 23 июля 2015

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

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

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

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

Я обычно называю это "cn.awk", для чисел c'olumn. Креатив, а? В любом случае, вывод выглядит так:

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"]
    }

Главное преимущество - сделать скрипт более читабельным.

0 голосов
/ 02 января 2013

Печать строк между двумя рисунками:

awk '/END/{flag=0}flag;/START/{flag=1}' inputFile

Подробное объяснение: http://nixtip.wordpress.com/2010/10/12/print-lines-between-two-patterns-the-awk-way/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...