在awk中通过system调用sql语句来说明引号的使用
一个实际应用例子: 在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语句来说明引号的使用的更多相关文章
- Entity FrameWork 5 增删改查 & 直接调用sql语句 ?
#region 1.0 新增 -void Add() /// <summary> /// 1.0 新增 /// </summary> static void Add() { / ...
- 如何查找MySQL中查询慢的SQL语句
如何查找MySQL中查询慢的SQL语句 更多 如何在mysql查找效率慢的SQL语句呢?这可能是困然很多人的一个问题,MySQL通过慢查询日志定位那些执行效率较低的SQL 语句,用--log-slow ...
- 第七节:EF Core调用SQL语句和存储过程
一. 查询类(FromSql) 1.说明 A. SQL查询必须返回实体的所有属性字段. B. 结果集中的列名必须与属性映射到的列名相匹配. C. SQL查询不能包含关联数据 D. 除Select以为的 ...
- sqlserver中查询表字段的sql语句
sqlserver中的表信息字段信息这些东西也是放到系统表中的,以下sql语句用于查询某表的字段信息. select t1.id object_id,t1.name object_name,t2.va ...
- Mysql中 查询慢的 Sql语句的记录查找
Mysql中 查询慢的 Sql语句的记录查找 慢查询日志 slow_query_log,是用来记录查询比较慢的sql语句,通过查询日志来查找哪条sql语句比较慢,这样可以对比较慢的sql可以进行优化. ...
- Springboot中mybatis控制台打印sql语句
Springboot中mybatis控制台打印sql语句 https://www.jianshu.com/p/3cfe5f6e9174 https://www.jianshu.com/go-wild? ...
- 在Access中批量调用SQL语句
access的SQL视图一次只能执行一条SQL语句,那么在VBA中调用或许可以简便一些 例如: Public Sub 批量()Dim strsql As String strsql = " ...
- Entity FrameWork 5 增删改查 & 直接调用sql语句
class="brush:csharp;gutter:true;"> #region 1.0 新增 -void Add() /// <summary> /// 1 ...
- Java将文件中的内容转换为sql语句(和并发定时读取文件)
数据文件内容data.txt {USER_TYPE=1,CREATE_USER=ZHANG,UPDATE_USER=li,OPER_NUM=D001,SRC=2,UPDATE_TIME=2018-11 ...
随机推荐
- HDU - 5651 xiaoxin juju needs help 逆元模板
http://acm.hdu.edu.cn/showproblem.php?pid=5651 题意:生成回文串.输出所有回文串的可能数. 题解:mod除法会损失高位,用逆元来代替除法,模板如下 ac代 ...
- 批量转换gbk编码的java代码为utf8
#!/bin/bash echo $1 echo $# if [ ! $# -eq 1 ]; then echo "usage: ./gbk2utf8.sh src" ...
- is_link
'Symbolic Link' to File1 content containing path to File1'Hard Link' to File1 content containing Fi ...
- FW Windows下DOS命令大全(经典收藏)---mklink
dos command port-->PID: netstat -ano | findstr port | tasklist |findstr "" Windows SYST ...
- Python开发【笔记】:获取mp3文件获取信息
import eyed3 def main(): mp3 = '8200031001_13429822982_1_00163e086216990b11e82403f00d3d9a.mp3' xx = ...
- Github常用命令【转】
本地仓库(local repository) 创建一个本地仓库的流程: 为本地仓库创建一个目录 在目录中执行 git init 对本地仓库所做的改变(例如添加.删除文件等)首先加入到本地仓库的 Ind ...
- hadoop学习---运行第一个hadoop实例
hadoop环境搭建好后,运行第wordcount示例 1.首先启动hadoop:sbin/start-dfs.sh,sbin/start-yarn.sh(必须能够正常运行) 2.进入到hadoo ...
- 非受限联合体 - 现代C++新特性总结
非受限联合体 非受限联合体:C++98中并不是所有数据类型都能够成为union的数据成员,不允许联合体拥有非POD(Plain Old Data).静态或引用类型的成员. C++11中取消了联合体对于 ...
- LVS + Keepalived 实现高可用、负载均衡 Web 集群
简介: LVS 是 Linux Virtual Server 的简写,Linux 虚拟服务器的意思,是一个虚拟的服务器集群系统,此项目由章文嵩博士于 1998 年 5 月成立,是中国最早出现的自由软件 ...
- #C++初学记录(算法考试1)
B - Maximal Continuous Rest Each day in Berland consists of n hours. Polycarp likes time management. ...