次の出力から@文字の数を取得するにはどうすればよいですか。tr
コマンドを使用して抽出しましたか?私はそれを行うための最良の方法を知りたいのですが?私は同じことをする他の方法を意味します。
{running_device,[test@01,test@02]},
私の解決策は次のとおりです。
echo '{running_device,[test@01,test@02]},' | tr ',' '\n' | grep '@' | wc -l
使用する方が簡単だと思います。
echo '{running_device,[test@01,test@02]},' | tr -cd @ | wc -c
これで2が得られます(Mac OS X 10.7.5でテスト済み)。(指定された文字のセットの)「補完」を意味し、「削除」-c
を意味するオプション。これにより、すべての非文字が削除され、提供されたものがカウントされます(改行がないため、行数は0ですが、文字数は2です)。 )。tr
-d
@
wc
あなたのアプローチに問題はありません。他のいくつかのアプローチは次のとおりです。
echo $(echo {running_device,[test@01,test@02]}, |awk -F"@" '{print NF - 1}')
また
echo $((`echo {running_device,[test@01,test@02]} | sed 's+[^@]++g' | wc -c` - 1 ))
私が抱える唯一の懸念は、このコマンドをループで実行している場合です(たとえば、大きなファイルの行ごとに1回)。その場合、シェルユーティリティをつなぎ合わせると、プロセスを起動するオーバーヘッドが発生し、処理が遅くなる可能性があるため、実行時間が問題になる可能性があります。この場合、ファイル全体を処理するために純粋なawkバージョンを作成することをお勧めします。
これを行う別の方法は、私が個人的に直感的だと思っています。grepを使用して一致する文字だけを抽出し、grepの出力行をカウントします。例えば:
echo '{running_device,[test@01,test@02]},' |
fgrep --fixed-strings --only-matching @ |
wc -l
結果としてが得2
られます。