ls
これで、プログラムを2つのファイルに分割しました。awk
の唯一の目的は。次のようになります。ls -lhF
my_ls.sh
my_ls.awk
my_ls.sh
ls -lhF
my_ls.awk
#!/bin/bash
ls -lhF "$@" | my_ls.awk
ls -lhF
awkスクリプト自体を介して出力を読み取る方法があるかどうか疑問に思います。
編集する:私の主な目的は、現在のディレクトリの内容を素晴らしいツリーの形で表示するスクリプトを書くことです。ドラフトバージョンは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を使用します。