私はmysqlクエリを使用しているbashスクリプトを書いています。このスクリプトでは、取得するフォーマットがかなり異なります。
クエリ:
root@debian:~# mysql -u root -ptoor super_market -h 0 -e "select * from items;"
+---------+------------+--------+-------------+-------+
| item_id | item_name | weight | brand | price |
+---------+------------+--------+-------------+-------+
| 1 | Milk | 2.00 | Nestle | 2.00 |
| 2 | Cheese | 2.50 | Amul | 6.00 |
| 3 | Chips | 25.00 | Lays | 3.00 |
| 4 | Coke | 5.00 | Coke Cola | 3.50 |
| 5 | Engage | 5.00 | Deo | 3.50 |
| 6 | Engage | 5.00 | Deo | 3.50 |
| 7 | Ear phones | 4.00 | Skull Candy | 32.30 |
+---------+------------+--------+-------------+-------+
column -tコマンドを使用してフォーマットされ、出力フォーマットが調整されます
root@debian:~# mysql -u root -ptoor super_market -h 0 -e "select * from items;" | column -t
item_id item_name weight brand price
1 Milk 2.00 Nestle 2.00
2 Cheese 2.50 Amul 6.00
3 Chips 25.00 Lays 3.00
4 Coke 5.00 Coke Cola 3.50
5 Engage 5.00 Deo 3.50
6 Engage 5.00 Deo 3.50
7 Ear phones 4.00 Skull Candy 32.30
Bash Script上記のコマンドを使用して試したbashスクリプト
root@debian:~# cat test
#!/bin/bash
while read -r output;
do
echo $output | awk '{print $4}'
#do something
done< <(mysql -u root -ptoor super_market -h 0 -e "select * from items;" | sed 1d |column -t)
出力
root@debian:~# ./test
Nestle
Amul
Lays
Coke
Deo
Deo
4.00
しかし期待される出力:
Nestle
Amul
Lays
Coke Cola
Deo
Deo
Skull Candy
うん! アイテムからブランドを選択と言うことができます。これは、たとえば、リアルタイムでかなり異なるコマンドを使用しています。
ヒントやヘルプはありますか?
mysqlの出力はタブ区切りです。 column
は、入力を中断するタブをスペースに置き換えます。
#!/bin/bash
while read -r output;
do
# use double quotes with "$output" to avoid conversion
# of tabs to spaces and set awk's Field Separator to "\t"
echo "$output" | awk -F"\t" '{print $4}'
#do something
done< <(mysql -u root -ptoor super_market -h 0 -e "select * from items;" | sed 1d)
テスト走行:
root@c2:~# mysql -u root -ptoor super_market -h 0 -e "select * from items;"
+---------+------------+--------+-------------+-------+
| item_id | item_name | weight | brand | price |
+---------+------------+--------+-------------+-------+
| 1 | Milk | 2 | Nestle | 2 |
| 2 | Cheese | 2.5 | Amul | 6 |
| 3 | Chips | 25 | Lays | 3 |
| 4 | Coke | 5 | Coke Cola | 3.5 |
| 5 | Engage | 5 | Deo | 3.5 |
| 6 | Engage | 5 | Deo | 3.5 |
| 7 | Ear phones | 4 | Skull Candy | 32.3 |
+---------+------------+--------+-------------+-------+
root@c2:~# ./test.sh
Nestle
Amul
Lays
Coke Cola
Deo
Deo
Skull Candy
root@c2:~#
mysql
を-t
フラグと共に使用して、mysqlのクエリから取得した出力をbash出力として直接取得します。
その後、sed
またはawk
を使用して区切り文字をクリーンアップし、水平線と|
を削除できます。
これは非常にダーティでハックな解決策ですが、ドット(.
)は、両側に浮動小数点数があるため、セパレータとして使用します。次のようにawk
を呼び出すことができます
awk -F '.' '{a=gensub(/^[0-9]*\s*|\s*[0-9]*$/,"","g",$2); print a}'
スクリプトで、それはブランドのみを印刷するものとします。
ブランド名の中央に余分なスペースがありますが、awk
スクリプトを拡張して、それに対処することもできます。
awk -F '.' '{a=gensub(/^[0-9]*\s*|\s*[0-9]*$/,"","g",$2); b=gensub(/\s+/," ","g",a); print b}'
awk
のgensub
関数は、このような種類の問題に対して非常に強力なツールです。この特定の例は汚いですが、gensub
( マニュアルはかなりまともです )の使用方法を知っていれば、同様の問題を簡単に解決できると思います。
上記はGNU awk
(gawk
)固有。古い学校のUNIXシステム(AIX
、HP-UX
)gawk
がありません。面白いことに、何らかの未知の理由により、debian
にはデフォルトでgawk
もありません。 debian
には、デフォルトとしてmawk
がインストールされていますawk
がインストールされています。これはmawk
バージョンです:
awk -F '.' '{gsub(/^[0-9]*\s*|\s*[0-9]*$/,"",$2); gsub(/\s+/," ",$2); print $2}'
mawk
にはgensub
がなく、gsub
(グローバル置換)のみがあります。 gsub
は、置換を返さないため、gensub
より大幅に劣ります。 debian
を使用していて、awk
が必要な場合は、gawk
をインストールすることを強くお勧めします(メインリポジトリにあります)。
テーブルは実際に完成しているので、column
ツールを使用する必要はありません。 awk
を一般的な区切り文字|
とともに使用してみてください。
echo
行で次のことができます
echo "$output" | awk -F'|' '{print $5}'
だからそれは
#!/bin/bash
while read -r output;
do
echo $output | awk '{print $5}'
#do something
done< <(mysql -u root -ptoor super_market -h 0 -e "select * from items;" | sed '1,2d')