一个实际应用例子: 在awk中,通过system调用连接数据库并作select操作,select语句中where条件来自于一个文件(file)的第一个域($1)。

$ cat file
... ...

1. 用awk实现:

awk '{system("mysql -u root -proot mydatabase -Bse \"select id,name from tables where id=""\047"$1"\047""\042")}' file

为什么类似上面的语句可以达到目的呢?首先,我们来将这个语句进行详细分解,因为有这么多引号和转义符,看起来确实很让人头大。直接看system语句的内容(说明:为了看得更清楚,将由双引号分隔的子字符串以空格和回车符分开。):

"mysql -u root -proot mydatabase -Bse \"select id,name from tables where id="
"\047"
$
"\047"
"\042"

解释:\047和\042分别为单引号和双引号的转义符号(可以在shell终端通过echo -ne “\047″和echo -ne “\042″输出看它们代表的字符),相匹配的引号以相同的颜色进行标记。\”  与  \042 配对,\047 与 \047 配对,然后将这5个部分拼接起来就构成一个完整的语句。

2. 该语句也可以写成:

awk '{system("mysql -u root -proot mydatabase -Bse \"select id,name from tables where id='\''"$1"'\''\"")}' file

引号分解:

awk '{system( "...id= '      \'      '      "  $1  "    '    \'     '    \"     "   )}' file

    #^最外层的引号(无论是单引号或双引号),是shell解释的,shell将引号内的内容当成一个不可拆分的整体,去掉最外层引号后传给awk,多双引号连在一起,中间无空格,仍作为1个位置参数传给awk

                      #^关了单引号,好让\'传给awk一个转义的'

                                     #^开单引号

                                            #^关了双引号,好引用$

                                                   #^awk system参数的前双引号

                                                        #^shell的外层后单引号,目的是要传一个转义单引号给awk

                                                              #^shell转义单引号给awk,前后不能空,空了awk程序就断开了

                                                                    #^shell解释的外层前单引号,前面不能空

                                                                          #^传给子进程shell的双引号,前后可空

                                                                                #^awk后双引号,前面可空

3. 将sql语句的结果存储为一个awk变量

export dbfile=./freepbx.db   # 定义shell变量,freepbx.db为freepbx的sqlite3数据库文件
echo | awk '{var=1000;("sqlite3 '$dbfile' \"select name,sipname from users where extension="var"\"") | getline data;print data }'
#引号分解:
echo | awk '{var=1000;("sqlite3 '$dbfile' \"select ... extension="var" \" ") | getline data;print data }' #^最外层,由shell解释 #^调用shell执行括号内的命令,去掉括号会报错:/bin/sh: -c: 行 : 寻找匹配的 `"' 是遇到了未预期的文件结束符;/bin/sh: -c: 行 1: 语法错误: 未预期的文件结尾 #^关闭单引号,传递shell变量 #^打开单引号 #^关闭双引号,传递awk变量 #^开双引号 #^关闭双引号

在awk中通过system调用sql语句来说明引号的使用的更多相关文章

  1. Entity FrameWork 5 增删改查 & 直接调用sql语句 ?

    #region 1.0 新增 -void Add() /// <summary> /// 1.0 新增 /// </summary> static void Add() { / ...

  2. 如何查找MySQL中查询慢的SQL语句

    如何查找MySQL中查询慢的SQL语句 更多 如何在mysql查找效率慢的SQL语句呢?这可能是困然很多人的一个问题,MySQL通过慢查询日志定位那些执行效率较低的SQL 语句,用--log-slow ...

  3. 第七节:EF Core调用SQL语句和存储过程

    一. 查询类(FromSql) 1.说明 A. SQL查询必须返回实体的所有属性字段. B. 结果集中的列名必须与属性映射到的列名相匹配. C. SQL查询不能包含关联数据 D. 除Select以为的 ...

  4. sqlserver中查询表字段的sql语句

    sqlserver中的表信息字段信息这些东西也是放到系统表中的,以下sql语句用于查询某表的字段信息. select t1.id object_id,t1.name object_name,t2.va ...

  5. Mysql中 查询慢的 Sql语句的记录查找

    Mysql中 查询慢的 Sql语句的记录查找 慢查询日志 slow_query_log,是用来记录查询比较慢的sql语句,通过查询日志来查找哪条sql语句比较慢,这样可以对比较慢的sql可以进行优化. ...

  6. Springboot中mybatis控制台打印sql语句

    Springboot中mybatis控制台打印sql语句 https://www.jianshu.com/p/3cfe5f6e9174 https://www.jianshu.com/go-wild? ...

  7. 在Access中批量调用SQL语句

    access的SQL视图一次只能执行一条SQL语句,那么在VBA中调用或许可以简便一些 例如: Public Sub 批量()Dim strsql As String   strsql = " ...

  8. Entity FrameWork 5 增删改查 & 直接调用sql语句

    class="brush:csharp;gutter:true;"> #region 1.0 新增 -void Add() /// <summary> /// 1 ...

  9. Java将文件中的内容转换为sql语句(和并发定时读取文件)

    数据文件内容data.txt {USER_TYPE=1,CREATE_USER=ZHANG,UPDATE_USER=li,OPER_NUM=D001,SRC=2,UPDATE_TIME=2018-11 ...

随机推荐

  1. 洛谷P2634 聪聪可可 [国家集训队] 点分治/dp

    正解:点分治/dp 解题报告: 传送门! 这题有两个做法,都是我不擅长的就都说下好了QAQ 首先这题一看到就会想到点分治? 也确实可以用点分治,那就直接用点分治鸭 每次求出到当前根距离余数为0,1,2 ...

  2. 建立一个更高级别的查询 API:正确使用Django ORM 的方式(转)

    add by zhj: 本文作者是DabApps公司的技术主管,作者认为在view中直接使用Django提供的ORM查询方法是不好的,我对此并不赞同,可能作者 写这篇文章是给Django的初学者看,所 ...

  3. QEMU IO事件处理框架

    Qemu IO事件处理框架 qemu是基于事件驱动的,在基于KVM的qemu模型中,每一个VCPU对应一个qemu线程,且qemu主线程负责各种事件的监听,这里有一个小的IO监听框架,本节对此进行介绍 ...

  4. 时间序列深度学习:状态 LSTM 模型预測太阳黑子(一)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/kMD8d5R/article/details/82111558 作者:徐瑞龙,量化分析师,R语言中文 ...

  5. 系列解读Dropout

    本文主要介绍Dropout及延伸下来的一些方法,以便更深入的理解. 想要提高CNN的表达或分类能力,最直接的方法就是采用更深的网络和更多的神经元,即deeper and wider.但是,复杂的网络也 ...

  6. 使用对象作为hashMap的键,需要覆盖hashcode和equals方法

    1:HashMap可以存放键值对,如果要以对象(自己创建的类等)作为键,实际上是以对象的散列值(以hashCode方法计算得到)作为键.hashCode计算的hash值默认是对象的地址值. 这样就会忽 ...

  7. HTML输入框的默认显示内容

    在某些情况下我们会需要在输入框里默认显示一些内容,比如在登录的时候不在输入框前面显示用户名和密码,直接在输入框里显示,这时只要在input的标签里添加属性  placeholder="用户名 ...

  8. Liferay中request

    在liferay中的请求分为renderRequest和actionRequest这两种请求的方式,portletRequest的子类有三个1renderRequest,2EventRequest3C ...

  9. Integer类之成员变量

    一.一共11个成员变量. 二.详情介绍. 1.value值.这个是Integer类的唯一标志.最重要的实例属性. 2.最小值和最大值常量.注意,计算机里面是以补码形式保存的,因此用十六进制时,给的数据 ...

  10. 024-linux中动态库libXXX.so

    1.动态库的概念.动态链接库与普通的程序相比而言,没有main函数,是一系列函数的实现.通过shared和fPIC编译参数生产so动态链接库文件.程序在调用库函数时,只需要连接上这个库即可. 2.动态 ...