web-dev-qa-db-ja.com

BashスクリプトのMysql出力形式

私は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

うん! アイテムからブランドを選択と言うことができます。これは、たとえば、リアルタイムでかなり異なるコマンドを使用しています。

ヒントやヘルプはありますか?

4

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:~# 
2
adonis

mysql-tフラグと共に使用して、mysqlのクエリから取得した出力をbash出力として直接取得します。

その後、sedまたはawkを使用して区切り文字をクリーンアップし、水平線と|を削除できます。

1
sjas

これは非常にダーティでハックな解決策ですが、ドット(.)は、両側に浮動小数点数があるため、セパレータとして使用します。次のように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}'

awkgensub関数は、このような種類の問題に対して非常に強力なツールです。この特定の例は汚いですが、gensubマニュアルはかなりまともです )の使用方法を知っていれば、同様の問題を簡単に解決できると思います。


上記はGNU awkgawk)固有。古い学校のUNIXシステム(AIXHP-UXgawkがありません。面白いことに、何らかの未知の理由により、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をインストールすることを強くお勧めします(メインリポジトリにあります)。

0
grochmal

テーブルは実際に完成しているので、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')
0
tachomi