2017-11-08 6 views
-1

似たような質問がたくさんありますが、私の問題を修正したものは見つかりませんでした。それは私がgoogleに何を知らない可能性があります。改行で区切られ、スペースを含むコマンドの出力から配列を作成します。

私は配列のペアを作成しようとしているし、両方のインデックスをループします。配列の内容は、このコマンドで生成されます。

$ cat small | grep -Po "(?<=Query:).+$" | grep -v "use" 

select count(*) from batting_small 
select count(*) from batting_small_parquet 
select count(*) from batting_small_parquet_stats 
select yearid, count(*) from batting_small_parquet group by yearId 
select yearid, count(*) from batting_small_parquet_stats group by yearId 
select min(hr), max(hr) from batting_small 
select min(hr), max(hr) from batting_small_parquet 
select min(hr), max(hr) from batting_small_parquet_stats 
... 

しかし、この

queries=(` cat small | grep -Po "(?<=Query:).+$" | grep -v "use" `) 

スプリット言葉によってではなく線でのような配列を作ります。どのように行単位で分割できますか?

+0

あなたはmysqlの低速ログファイルを分析するように見えますが、その目的のためにmysqlパッケージに特別なルーチンmysqldumpslowがあります。 mysqldumpslow --help –

+0

これらはmysqlログではありませんが、 – bendl

答えて

1

mapfile、bashの組み込みを使用して、プロセスの置換からgrepコマンドをリダイレクト:

mapfile -t queries < <(grep -Po "(?<=Query:).+$" small | grep -v "use") 
1

あなたはNUL終端出力を生成し、その後while IFS= read -d ''ループにプロセス置換を使用するgrep-zオプションを使用することができます。

while IFS= read -d '' -r line; do 
    echo "<<$line>>" 
done < <(ggrep -zPo '(?m)(?!.*use)(?<=Query:).+$' small) 

<<select count(*) from batting_small>> 
<<select count(*) from batting_small_parquet>> 
<<select count(*) from batting_small_parquet_stats>> 
<<select yearid, count(*) from batting_small_parquet group by yearId>> 
<<select yearid, count(*) from batting_small_parquet_stats group by yearId>> 
<<select min(hr), max(hr) from batting_small>> 
<<select min(hr), max(hr) from batting_small_parquet>> 
<<select min(hr), max(hr) from batting_small_parquet_stats>> 

echo "<<$line>>"行を実際のコードに変更してください。

(?m)を使用して正規表現でMULTILINEモードを有効にし、否定先読み(?!.*use)を使用して別のgrep -vを回避することにも注意してください。

関連する問題