4

AWKは本当に便利だと思います。これが私がデータを操作するためにまとめたワンライナーです。

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

このAWKを使用して、一部のファイルの名前を変更し、選択した列のみを出力するスクリプトファイルを作成しました。誰かがこれを行うためのより良い方法を知っていますか?あなたは最高のAWKワンライナーまたは巧妙な操作は何ですか?

4

12 に答える 12

8

AWKの本には素晴らしい例がたくさんあります。以前は、 Kernighan の Web ページ(現在は 404)からダウンロードするために収集されていました。

于 2008-11-07T21:54:26.390 に答える
4

ここでいくつかの素敵なワンライナーを見つけることができます.

于 2009-01-09T14:37:24.637 に答える
2

私はこれを使用します:

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

ファイルシステム全体でシステムで使用されているすべてのディスク容量を合計します。

于 2009-01-08T15:53:06.037 に答える
1

Henry Spencerは、awkでnroffのかなり良い実装を作成しました。彼はそれを「awf」と呼んだ。彼はまた、ラリー・ウォールがawkがどれほど強力であるかを知っていれば、perlを発明する必要はなかったと主張しました。

于 2008-11-07T21:20:40.433 に答える
1

これは、私が定期的に使用していたいくつかの awks です... $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 を使用して行うことができます。

于 2008-11-07T21:43:27.643 に答える
1

このスクリプトは、PATH やパスに似た環境変数を編集するためによく使用します。使用法:

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

このコマンドは、PATH の前に /new/bin と /other/bin を追加し、PATH から /old/bin と /other/old/bin の両方を削除し (存在する場合 - 存在しない場合はエラーなし)、パス上の重複するディレクトリ エントリを削除します。

:   "@(#)$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;
}'
于 2008-11-08T08:56:56.613 に答える
0

UNIX用のDOSツリーコマンドエミュレーターを構築することができました(find + awk):

find . -type d -print 2>/dev/null|awk '{for (i=1;i< NF;i++)printf("%"length($i)"s","|");gsub(/[^\/]*\//,"--",$0);print $NF}'  FS='/'
于 2012-07-13T10:20:31.060 に答える
0

お互いに本質的に無関係なお気に入りのカップル。接続されていない 2 つの異なる提案としてお読みください。

列番号を簡単に特定する

:

仕事でログ分析を行うときのように awk を頻繁に使用する場合、ファイルの列番号を調べる必要があることがよくあります。したがって、たとえば Apache アクセス ファイルを分析する場合 (いくつかのサンプルはここにあります)、ファイルに対して以下のスクリプトを実行します。

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

私は通常、「c'olumn 'umbers」を意味する「cn.awk」と呼んでいます。クリエイティブですよね?とにかく、出力は次のようになります。

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

主な利点は、スクリプトをより読みやすくすることです。

于 2015-07-22T21:37:34.017 に答える
0

2 つのパターンの間に線を印刷します。

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

詳細な説明: http://nixtip.wordpress.com/2010/10/12/print-lines-between-two-patterns-the-awk-way/

于 2013-01-02T08:45:59.287 に答える
0

httpd が使用するメモリをカウントする

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

または、httpd を置き換えることによるその他のプロセス。1024 で割ると MB 単位で出力されます。

于 2009-10-20T23:16:52.817 に答える
0

フィールドの印刷は、ほとんどの AWK チュートリアルで最初に言及されることの 1 つです。

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

あまり知られていませんが、同様に有用なのはフィールドの除外です。これも可能です:

awk '{$1=$3=""}1' file
于 2016-08-05T20:07:28.103 に答える