awkスクリプトのパイプ

awkスクリプトのパイプ

lsこれで、プログラムを2つのファイルに分割しました。awkの唯一の目的は。次のようになります。ls -lhFmy_ls.shmy_ls.awkmy_ls.shls -lhFmy_ls.awk

#!/bin/bash
ls -lhF "$@" | my_ls.awk

ls -lhFawkスクリプト自体を介して出力を読み取る方法があるかどうか疑問に思います。

編集する:私の主な目的は、現在のディレクトリの内容を素晴らしいツリーの形で表示するスクリプトを書くことです。ドラフトバージョンはmy_ls.awk次のとおりです。

#!/usr/bin/awk -f

( NF >= 9 ) {
    print "|-- [" $5 "] " $9
}

これこれが私がこれまでに達成したことです。

ベストアンサー1

出力を解析してはならないという別の提案を追加するので、lsこれは悪い例です。しかし、より一般的な質問にawkスクリプトをパラメータとしてawk

#!/bin/bash
ls -lhF "$@" | awk '
    ( NF >= 9 ) {
        print "|-- [" $5 "] " $9
    }'

awkスクリプトに'(二重引用符)文字を含める必要がある場合は、引用符で囲む必要があります。'\''(閉じる一重引用符、リテラル一重引用符、開く一重引用符)を使用してください。

引用を避けるには、次のものを使用できます。ここのドキュメント代わりに。ただし、標準入力を使用してawkとスクリプトの両方に入力を提供できないため、これは厄介です。追加のファイル記述子を使用する必要があります(参照:追加のファイル記述子はいつ使用されますか? ファイル記述子とシェルスクリプト)。

#!/bin/bash
ls -lhF "$@" | awk -f /dev/fd/3 3<<'EOF'
( NF >= 9 ) {
    print "|-- [" $5 "] " $9
}
EOF

awkでは、getline関数とパイプ構成を使用して他のコマンドの入力を読み取ることができます。これはawkの基本的な目的ではありませんが、うまく機能させることができます。エラーが発生しやすい基本シェルのファイル名引数を引用する必要があります。処理中のテキストが期待されるソース(標準入力またはコマンドラインで名前付きファイル)から出ていないため、最終的にブロック内のすべてのコードが生成されますBEGIN

#!/usr/bin/awk -f
BEGIN {
    command = "ls -lhF"
    for (i = 1; i <= ARGC; i++) {
        arg = ARGV[i];
        gsub("'", "'\\''", arg);
        command = command " '" arg "'";
    }
    ARGC = 0; for (i in ARGV) delete ARGV[i];
    while ((command | getline) > 0) {
        if (NF >= 9) { print "|-- [" $5 "] " $9 }
    }
}

簡単に言えば、シェルがうまくいく操作(コマンドを一緒にリンクするなど)にはシェルを使用し、うまくいくタスク(テキスト処理など)にはawkを使用します。

おすすめ記事