2つの変数を含むディレクトリファイルの数を数えてから、1つのコマンドでそれをテキストファイルに入れる方法

2つの変数を含むディレクトリファイルの数を数えてから、1つのコマンドでそれをテキストファイルに入れる方法

助けが必要です。

a)TCPとUDPのパラメータ数を含むファイルを生成するコマンドを作成します。他のプロトコル(IPまたはXFRMなど)のパラメータは計算に含めないでください。

これらのパラメータは/ proc / sys / net / ipv4 /の個々のファイルに設定され、プロトコル(TCPまたはUDP)はファイル名の最初の数文字で決定されます。一行)。

個々のコマンドはパイプとリダイレクトを使用できますが、コマンドを単純に組み合わせることはできません(例:;を使用)。最初の数行の例は次のとおりです。63
tcp
3 udp

これが私が今まで持っているものです:

ls -l /proc/sys/net/ipv4 | grep -n "tcp\|udp"| cut -d " " -f 10| cut -c 1-3 

ベストアンサー1

この場合、ファイル数を計算するためにパイプやリダイレクトを使用するのではなく、シェルでこれを行うようにしました。

$ set -- /proc/sys/net/ipv4/tcp*
$ printf '%d tcp\n' "$#"
73 tcp
$ set -- /proc/sys/net/ipv4/udp*
$ printf '%d udp\n' "$#"
5 udp

または出力ファイルに書き込みます。

{ set -- /proc/sys/net/ipv4/tcp*; printf '%d tcp\n' "$#"
  set -- /proc/sys/net/ipv4/udp*; printf '%d udp\n' "$#"; } >outputfile

これを人為的に単一の複合コマンドに変換できますが、誰も次のコードを書くことはありません。

$ set -- /proc/sys/net/ipv4/tcp* && printf '%d tcp\n' "$#" && set -- /proc/sys/net/ipv4/udp* && printf '%d udp\n' "$#"
73 tcp
5 udp

両方のコマンドセットでファイル名のワイルドカードパターンを展開し、位置引数を拡張パス名のリストに設定し、リストの要素数を出力するだけでファイル数を計算します。

2つのパターンのいずれかが一致しない場合(0ではなく1)、誤った数が得られます。設定nullglobのシェルオプションを使用してこの問題を解決できますbash

これは、ファイル名に改行やその他の奇妙な文字が含まれる理論的なコーナーケースにも当てはまります。


上記と同じ操作を実行するコマンド(例:awkおよびで始まるファイル名の発生回数の計算):tcpudp

awk '
    BEGIN {
        for (i=1;i<ARGC;++i) { sub(".*/","",ARGV[i]); sub("_.*","",ARGV[i]); c[ARGV[i]]++ }
        for (i in c) print i, c[i]
    }' /proc/sys/net/ipv4/{tcp,udp}*

おすすめ記事