web-dev-qa-db-ja.com

変数としてのwcの結果

「wc」からの行を変数として使用したいと思います。例えば:

echo 'foo bar' > file.txt
echo 'blah blah blah' >> file.txt
wc file.txt

2  5 23 file.txt

$lines$words、および$charactersの値に関連付けられている25、および23のようなものが欲しいです。どうすればbashでそれを行うことができますか?

26
719016

他の解決策もありますが、私が通常使用する簡単な解決策は、wcの出力を一時ファイルに入れ、そこから読み取ることです。

wc file.txt > xxx
read lines words characters filename < xxx 
echo "lines=$lines words=$words characters=$characters filename=$filename"
lines=2 words=5 characters=23 filename=file.txt

この方法の利点は、変数ごとに1つ、複数のawkプロセスを作成する必要がないことです。欠点は、一時ファイルが必要なことです。このファイルは後で削除する必要があります。

注意:これは機能しません:

wc file.txt | read lines words characters filename

問題は、readへのパイプが別のプロセスを作成し、変数がそこで更新されるため、呼び出し元のシェルでアクセスできないことです。

編集:arnaud576875によるソリューションの追加:

read lines words chars filename <<< $(wc x)

ファイルに書き込むことなく動作します(パイプの問題はありません)。これはbash固有です。

Bashマニュアルから:

Here Strings

   A variant of here documents, the format is:

          <<<Word

   The Word is expanded and supplied to the command on its standard input.

キーは「Word is expand」ビットです。

13
dangonfast

純粋なbashの場合:(awkなし)

_a=($(wc file.txt))
lines=${a[0]}
words=${a[1]}
chars=${a[2]}
_

これは、bashの配列を使用して機能します。 a=(1 2 3)は、要素1、2、および3の配列を作成します。その後、_${a[indice]}_構文を使用して個別の要素にアクセスできます。

代替:(多角形のソリューションに基づく)

_read lines words chars <<< $(wc x)
_

またはshで:

_a=$(wc file.txt)
lines=$(echo $a|cut -d' ' -f1)
words=$(echo $a|cut -d' ' -f2)
chars=$(echo $a|cut -d' ' -f3)
_
38
Arnaud Le Blanc

別のバリアントを追加するだけです-

set -- `wc file.txt`
chars=$1
words=$2
lines=$3

これは明らかに_$*および関連変数。ここの他のソリューションの一部とは異なり、他のBourneシェルに移植できます。

4
tripleee

変数にcsvファイルの数を保存したかった。次は私のために働いた:

CSV_COUNT=$(ls ./pathToSubdirectory | grep ".csv" | wc -l | xargs)
  • xargsはwcコマンドから空白を削除します
  • このbashスクリプトは、csvファイルと同じフォルダーではなく実行しました。したがって、pathToSubdirectory
3
Simon Bachmann
lines=`wc file.txt | awk '{print $1}'`
words=`wc file.txt | awk '{print $2}'`
...

wcの結果を最初にどこかに保存してから解析することもできます。パフォーマンスにこだわりがある場合:)

3
duedl0r

サブシェルを開くと、変数に出力を割り当てることができます。

$ x=$(wc some-file)
$ echo $x
1 6 60 some-file

ここで、個別の変数を取得するための最も簡単なオプションは、awkを使用することです。

$ x=$(wc some-file | awk '{print $1}')
$ echo $x
1
0
Konrad Rudolph
declare -a result
result=( $(wc < file.txt) )
lines=${result[0]}
words=${result[1]}
characters=${result[2]}
echo "Lines: $lines, Words: $words, Characters: $characters"
0
Adrian Pronk