直接终端输出到Mysql表
Posted
技术标签:
【中文标题】直接终端输出到Mysql表【英文标题】:Direct terminal output to Mysql table 【发布时间】:2019-01-11 09:38:58 【问题描述】:我想将此 Linux 命令的输出发送到 mysql 表: 命令:
bzcat filename.bz2 | head -200 | cut -f2,13-15,17 | ruby -ne 'puts "#$_" if $_ =~ /\s\d+\.\d+/; ' | ruby -ne 'puts "#$_"' | cut -f1-5
命令文本输出:
6985418911 -81.804885 24.550558 12 http://farm8.staticflickr.com/7205/6985418911_df7747990d.jpg
10201275523 -79.365637 43.649708 16 http://farm6.staticflickr.com/5465/10201275523_3e6ea67c7f.jpg
7289030198 -73.985495 40.740067 15 http://farm8.staticflickr.com/7231/7289030198_1f1ba44113.jpg
4572998878 -71.047843 42.33719 16 http://farm4.staticflickr.com/3373/4572998878_658b45226f.jpg
3973434963 -0.384016 39.474441 15 http://farm3.staticflickr.com/2526/3973434963_76c26e3c88.jpg
2932067831 -109.4995 38.737861 16 http://farm4.staticflickr.com/3026/2932067831_8885c3d53f.jpg
此时 URL、Autotags 和 Photo/Video 字段需要为空。
【问题讨论】:
不是不写一些应用程序或脚本号。 这是一个很好的例子。您是否介意粘贴该命令输出的文本而不是图片(在每行前面添加 4 个空格以正确格式化)。这将使复制变得更容易。 【参考方案1】:您必须将输出格式化为 INSERT 语句,以便 Mysql 知道如何处理它。您还必须有一个表格来捕获输出。架构由您决定。一个简单的例子是:
mysql> CREATE DATABASE test;
Query OK, 1 row affected (0.01 sec)
mysql> use test;
Database changed
mysql> CREATE TABLE stdout_dump (line VARCHAR(5000));
Query OK, 0 rows affected (0.18 sec)
mysql> exit
Bye
现在您可以使用sed
或awk
或what-have-you 格式化您的输出并通过管道传输到mysql:
$ seq 1 10 | sed -r "s/(.*)/INSERT INTO test.stdout_dump VALUES ('\1');/g" | mysql -u youruser -p
这些值将被加载到您的表格中:
mysql> SELECT * FROM test.stdout_dump;
+------+
| line |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
+------+
10 rows in set (0.00 sec)
或者:
$ echo "this is another line" | sed -r "s/(.*)/INSERT INTO test.stdout_dump VALUES ('\1');/g" | mysql -u yourusername -p
mysql> SELECT * FROM test.stdout_dump;
+----------------------+
| line |
+----------------------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
| this is another line |
+----------------------+
11 rows in set (0.00 sec)
这是一个具有更复杂架构(表中有多个列)的示例。这实际上归结为在命令行上使用awk
或sed
或what-have-you 为您的表生成INSERT 语句,您可以将其通过管道传输到mysql:
$ cat testoutput
10201275523 -79.365637 43.649708 16 http://farm6.staticflickr.com/5465/10201275523_3e6ea67c7f.jpg
7289030198 -73.985495 40.740067 15 http://farm8.staticflickr.com/7231/7289030198_1f1ba44113.jpg
4572998878 -71.047843 42.33719 16 http://farm4.staticflickr.com/3373/4572998878_658b45226f.jpg
3973434963 -0.384016 39.474441 15 http://farm3.staticflickr.com/2526/3973434963_76c26e3c88.jpg
2932067831 -109.4995 38.737861 16 http://farm4.staticflickr.com/3026/2932067831_8885c3d53f.jpg
$ cat testoutput | awk 'printf "INSERT INTO test.Images (Hash, Lng, Lat, Accuracy, URL) VALUES (%s,%s,%s,%s,'\''%s'\'');\n", $1, $2, $3, $4, $5' | mysql -u yourusername -p
mysql> SELECT * FROM test.Images;
+------+-------------+-----------+---------------------------------------------------------------+-------------+----------+----------+-------------+
| id | Lng | Lat | URL | Hash | Autotags | Accuracy | Photo/Video |
+------+-------------+-----------+---------------------------------------------------------------+-------------+----------+----------+-------------+
| NULL | -79.365637 | 43.649708 | http://farm6.staticflickr.com/5465/10201275523_3e6ea67c7f.jpg | 10201275523 | NULL | 16 | NULL |
| NULL | -73.985495 | 40.740067 | http://farm8.staticflickr.com/7231/7289030198_1f1ba44113.jpg | 7289030198 | NULL | 15 | NULL |
| NULL | -71.047843 | 42.337190 | http://farm4.staticflickr.com/3373/4572998878_658b45226f.jpg | 4572998878 | NULL | 16 | NULL |
| NULL | -0.384016 | 39.474441 | http://farm3.staticflickr.com/2526/3973434963_76c26e3c88.jpg | 3973434963 | NULL | 15 | NULL |
| NULL | -109.499500 | 38.737861 | http://farm4.staticflickr.com/3026/2932067831_8885c3d53f.jpg | 2932067831 | NULL | 16 | NULL |
+------+-------------+-----------+---------------------------------------------------------------+-------------+----------+----------+-------------+
5 rows in set (0.00 sec)
如果您经常做这项工作,最好花点时间熟悉sed
和awk
以及mysql
INSERT 语句。
【讨论】:
请查看我的 Linux 命令:bzcat filename.bz2 | head -200 | cut -f2,13-15,17 | ruby -ne 'puts "#$_" if $_ =~ /\s\d+\.\d+/; ' | ruby -ne 'puts "#$_"' | cut -f1-5
数据库名称:YFkr,表名称:图像,字段(哈希、Lng、Lat、准确性、URL)。我无法将上述命令直接输出到我的表中。
也许如果您可以分享(在您的问题中备份)您的命令和表的 DDL 的示例输出,我们可以进一步提供帮助。我确信它可以完成,尽管它可能会变得丑陋,具体取决于输出的外观和表的字段类型。
请看一下!
我已经用一个与您正在处理的内容接近的示例更新了我的答案。在第二个答案中,我使用awk
将复杂命令的输出解析为INSERT
语句,然后通过管道传输到mysql。这里没有灵丹妙药,你可以盲目地输入 mysql 命令。在您的输出和mysql
之间总是需要一些东西来将数据转换为INSERT
可以理解的INSERT
语句。而那个“东西”必须是你编写的脚本。在这里,我使用了 sed
和 awk
单线来进行转换。以上是关于直接终端输出到Mysql表的主要内容,如果未能解决你的问题,请参考以下文章