質問
AWKは本当に便利だと思います。これが、データを操作するためにまとめた1つのライナーです。
ls | awk '{ print "awk " "'"'"'" " {print $1,$2,$3} " "'"'"'" " " $1 ".old_ext > " $1 ".new_ext" }' > file.csh
このAWKを使用して、一部のファイルの名前を変更し、選択した列のみを印刷するスクリプトファイルを作成しました。誰でもこれを行うためのより良い方法を知っていますか? AWKワンライナーまたは巧妙な操作で一番良いものは何ですか?
解決
AWKの本には素晴らしい例がたくさんあります。以前は、 KernighanのWebページからダウンロードするために収集されていました。 (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があなたに行うことです。遊ぶのはとても楽しいです。
Henry Spencerはawkでnroffのかなり良い実装を書きました。彼はそれを「awf」と呼んだ。また、Larry Wallがawkの威力を知っていれば、perlを発明する必要はなかったと主張しました。
ここで私が定期的に使用していたawksを2つ紹介します。$ 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)
このコマンドは、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 <*>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で除算すると、MB単位で出力されます。
UNIX用のDOSツリーコマンドエミュレーターを構築できました(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 '/END/{flag=0}flag;/START/{flag=1}' inputFile
詳細な説明: http://nixtip.wordpress.com/2010/10/12/print-lines-between-two-patterns-the-awk-way/
基本的に互いに関係のないいくつかのお気に入り。接続されていない2つの異なる提案として読みます。
列番号を簡単に識別する
:
仕事中のログ分析のようにawkを頻繁に使用する場合、ファイルの列番号を調べる必要があることがよくあります。したがって、たとえば、Apacheアクセスファイルを分析している場合(一部のサンプルはこちら)ファイルに対して以下のスクリプトを実行します:
NR == 1 {
for (i = 1 ; i <= NF ; i++)
{
print i "\t" $i
}
}
NR > 1 {
exit
}
「c'olumn 'n'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"]
}
主な利点は、スクリプトをより読みやすくすることです。
フィールドの印刷は、ほとんどのAWKチュートリアルで最初に言及されていることの1つです。
awk '{print $1,$3}' file
あまり知られていないが同様に有用なフィールドを除外することも可能です:
awk '{$1=$3=""}1' file