还是用perl来替换sed\grep吧

为了这个问题我折腾了一晚上。

事情是这样的,由于使用了mycat,所有多表联合查询在我们的数据库里都是没用的。

为了实现 select * from xxx where xxx in(1,2,3)这样的效果,我必须想办法把前一个查询的结果存为一个linux变量,由于我不知道怎样格式化查询结果,就想到用grep sed之类的工具来做。但是很可惜,sed支持的正则语法是令人无语的,还是perl最强大。

于是我开始各种搜索,但一切的说明都在讲怎样处理文件,最后还是IBM靠谱,虽然如下文章更像是机器翻译的结果,但解决了别人不说的大问题。

http://www.ibm.com/developerworks/cn/linux/sdk/perl/l-p101/index.html

总之就是Perl是可以接受管道命令作为输入的。

[heyuheng@pos-log ~]$ aa=’5 4 3 2′
[heyuheng@pos-log ~]$ echo $aa|perl -pe ‘s/\s/,/g’
5,4,3,2,[heyuheng@pos-log ~]$

 

 

这件事非常蛋疼。

当我写完一个类似 dd=”select * from xx where aa in(`echo $cc`)”的语句后,发现再echo $dd时,星号被替换成了当前目录下的文件列表!

我用set命令查看变量的时候,却发现值中的星号还是星号。

后来上网一查,原来echo时要避免这种情况必须在变量上套上引号,也就是echo “$dd”这种写法不会出问题。

17/12/10

补充一个s///操作符的说明。

正则表达式在Linux各命令中的区别

正则表达式虽好,但是不同环境不同工具对它的支持差异还是挺大的。
找了一个列表,方便速查。

grep 2.5.1 egrep 2.5.1 sed 3.02
sed 4.07
awk 3.1.1 perl 5.8.0 vim 6.1 JavaScript ??
转义 \ \ \ \ \ \ \
行头 ^ ^ ^ ^ ^ ^ ^
行尾 $ $ $ $ $ $ $
n个 {n} {m,n} {m,} {,n} \{n\} {n} \{n\} {n}或\{n\} 仅定义 –posix 或 –re-interval有效(要表达}和{,得用\\{和\\} 没有定义–posix或–re-interval时,不能用{n}的语法, \}\{和}{同义 {n} \{n\} {n}
{0,} * * * *或\*, (要表达*,得用\\*) * * *
{1,} \+ + \+ +或\+, (要表达+, 得用\\+) + \+ +
{0,1} \? ? \? ?或\?, (要表达?, 得用\\?) ? \? ?
任意字符 . . . . 含\n. . /s修饰后则含\n . 除\n . 除\n
(pat) 匹配并获结果 \(pat\) (pat) \(pat\) (pat)或\(pat\) (要表达括号,用\\( \\) ) (pat) \(pat\) (pat)
(?:pat) 匹配但不获结果 不支持 不支持 不支持 不支持 (?:pat) 不支持 (?:pat)
(?=pat) 等于预查 不支持 不支持 不支持 不支持 (?=pat) 不支持 (?=pat)
(?!pat) 不等预查 不支持 不支持 不支持 不支持 (?!pat) 不支持 (?!pat)
| 或 \| | \| |或\| (要表达|,得用\\|) | \| |
其中任意字符 [xyz] [xyz] [xyz] [xyz] [xyz] [xyz] [xyz]
[.ch.] [=ch=] 不支持 不支持 [.ch.] 不支持 不支持 不支持 不支持
单词边界 \b \b \b \b 不支持 \b 不支持 \b
非单词边界 \B \B \B \B 不支持 \B 不支持 \B
单词左右边界 <> \< \> \< \> \< \> 不支持 (><和\>\<和\\>\\<同义 不支持(><和\>\<同义 \< \> 不支持(><和\>\<同义
控制字符 /cx 不支持 不支持 \cx 不支持 \cx 不支持 \cx
数字\d 不支持 不支持 不支持 不支持 \d \d \d
非数字\D 不支持 不支持 不支持 不支持 \D \D \D
换页 \f 不支持 不支持 高版本支持 \f \f 另义 \f表示文件名字符 \f
换行 \n 不支持 不支持 不支持 \n \n \n \n
回车 \r 不支持 不支持 \r \r \r \r \r
空白 \s 不支持 不支持 不支持 不支持 \s \s \s
非空白 \S 不支持 不支持 不支持 不支持 \S \S \S
制表符 \t 不支持 不支持 高版本支持 \t \t \t \t
垂直制表符 \v 不支持 不支持 高版本支持 \v \v 另义 \v表示very magic \v
单词字符 \w [A-Za-z0-9_] \w \w \w 不支持 \w \w \w
非单词字符 \W [^A-Za-z0-9] \W \W \W 不支持 \W \W \W
\xn 16进制 不支持 不支持 高版本支持 \xn \xn 另义 \x表示[0-9A-Za-z] \xn
\n 八进制 不支持 不支持 不支持 \n \n 不支持 \n
\n 后向引用 \n \n \n \n 仅取结果可用 \n \n 仅取结果可用 \n
[:alnum:] 字母和数字 [:alnum:] [:alnum:] [:alnum:] [:alnum:] [:alnum:] [:alnum:] 不支持
[:alpha:] 字母 [:alpha:] [:alpha:] [:alpha:] [:alpha:] [:alpha:] [:alpha:] 不支持
[:cntrl:] 控制字符 [:cntrl:] [:cntrl:] [:cntrl:] [:cntrl:] [:cntrl:] [:cntrl:] 不支持
[:digit:] 数字 [:digit:] [:digit:] [:digit:] [:digit:] [:digit:] [:digit:] 不支持
[:graph:] 可打印字符(不含空格) [:graph:] [:graph:] [:graph:] [:graph:] [:graph:] [:graph:] 不支持
[:lower:] 小写 [:lower:] [:lower:] [:lower:] [:lower:] [:lower:] [:lower:] 不支持
[:print:] 可打印字符(含空格) [:print:] [:print:] [:print:] [:print:] [:print:] [:print:] 不支持
[:punct:] 标点 [:punct:] [:punct:] [:punct:] [:punct:] [:punct:] [:punct:] 不支持
[:space:] 空格 [:space:] [:space:] [:space:] [:space:] [:space:] [:space:] 不支持
[:upper:] 大写字母 [:upper:] [:upper:] [:upper:] [:upper:] [:upper:] [:upper:] 不支持
[:xdigit:] 16进制数字 [:xdigit:] [:xdigit:] [:xdigit:] [:xdigit:] [:xdigit:] [:xdigit:] 不支持
[:return:] 不支持 不支持 不支持 不支持 不支持 [:return:] 不支持
[:tab:] 不支持 不支持 不支持 不支持 不支持 [:tab:] 不支持
[:escape:] 不支持 不支持 不支持 不支持 不支持 [:escape:] 不支持
[:backspace:] 不支持 不支持 不支持 不支持 不支持 [:backspace:] 不支持

linux的grep默认是不支持perl正则表达式的

搞半天。
linux的grep默认是不支持perl正则表达式的。
我写的\d+之类的都没反应。
所以要加一个-P的参数,注意P是大写。
比如下面这样
|grep -P ‘\d{2,3}’
(上例是用管道把要查找的内容带过来,不然后面还应该有要查找的文件啥的)
之前我看到网上的说明说大刮号在bash里有特殊作用,因此要在它前面加上转义符(\)”。
但很显然,加了P之后,不用再搞这种了。
#######次日补充#######
P不是哪儿都支持,安卓里就没有这个开关,数字可以写成[0~9]
另外,安卓不像centos,里面的大刮号当真是要写斜杠才能用的,或许我在centos里用了P开关所以可以直接用吧

linux命令行中直接执行mysql语句

其实我一开始是拒绝的,但是貌似就得这么做。怎么一行一行的来?没法整了。

有两种方法可以在命令行下执行sql命令。第一种是使用“-e“参数来指定需要执行的sql语句;第二种是通过管道的方式。语法及例子如下:
1、
代码如下 复制代码
MYSQL_HOME/bin/mysql -u用户名 -p密码 -D数据库名 -e”sql 语句”
/usr/local/mysql/bin/mysql -uroot -p123456 -Dmysql -e”select host,user from user”;
2、

有两种方法可以在命令行下执行sql命令。第一种是使用“-e“参数来指定需要执行的sql语句;第二种是通过管道的方式。语法及例子如下:

1、

 代码如下 复制代码
MYSQL_HOME/bin/mysql -u用户名 -p密码 -D数据库名 -e”sql 语句”
/usr/local/mysql/bin/mysql -uroot -p123456 -Dmysql -e”select host,user from user”;

2、

 代码如下 复制代码
echo “sql 语句” | MYSQL_HOME/bin/mysql -u用户名 -p密码 -D数据库名
echo “select host,user from user” | /usr/local/mysql/bin/mysql -uroot -p123456 -Dmysql

代码如下 复制代码
echo “sql 语句” | MYSQL_HOME/bin/mysql -u用户名 -p密码 -D数据库名
echo “select host,user from user” | /usr/local/mysql/bin/mysql -uroot -p123456 -Dmysql

找好数

function getGoodNum(page){
console.log(page);
//var reg=/1[3578]\d*([123567890]{3})\1\d*/g;
var reg=/1[3578]\d*([123567890]{2})\1\d*/g;
var matches=page.match(reg);
if(matches){alert(matches)}
}

 

在wordpresss里想用code标签,就要先进到“文本”模式。

在看某国企的网站代码时,发现它竟然还用了eval来混淆代码,害我先上网找了代码来“破解”它,其实只要在Html里找到一个方法,在控制台里运行一下,啥都能看到,除非它进行了压缩,方法内部变量都变成abc,否则这种混淆根本一点意义都没有,到了控制台里怎么阅读都可以。只有那种用了奇怪的MVC的代码,还有点坑爹。否则都没啥意义。

每次搞这些,最后都会发现自己太过于急躁,其实一步步来,遇到的坑就会少很多。

上线惊魂

产品上线前还各种大改这种事,老司机肯定是司空见惯了。

让人难堪的是这样的场景:

上线前的压力测试把重要的不可再生的资源给消耗光了!

我曾经反复问过这个事,我说听说这玩意数量有限,说没事,没事,没事……