shel_command_grep

作用

Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。

格式

grep [options]

options 主要参数:

  1. -c:只输出匹配行的计数。
  2. -I:不区分大 小写(只适用于单字符)。
  3. -h:查询多文件时不显示文件名。
  4. -l:查询多文件时只输出包含匹配字符的文件名。
  5. -n:显示匹配行及 行号。
  6. -s:不显示不存在或无匹配文本的错误信息。
  7. -v:显示不包含匹配文本的所有行。
  8. -E 使用扩展正则表达式
  9. pattern正则表达式主要参数:
  10. \: 忽略正则表达式中特殊字符的原有含义。
  11. ^:匹配正则表达式的开始行。
  12. $: 匹配正则表达式的结束行。
  13. \<:从匹配正则表达 式的行开始。
  14. >:到匹配正则表达式的行结束。
  15. [ ]:单个字符,如[A]即A符合要求 。
  16. [ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。
  17. 。:所有的单个字符。
  18. * :有字符,长度可以为0。

grep命令的简单实例

  1. $ grep ‘test’ d*

    显示当前目录下所有以d开头的文件中包含test的行

  2. $ grep ‘test’ file1 file2 file3

    显示指定文件file1,file2,file3中包含test的行

  3. $ grep ‘[a-z]{5}‘ file

    显示指定文件file中至少包含连续5个小写字母的行

  4. $ grep ‘w(es)t.*\1’ file

    如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.*),这些字符后面紧跟着 另外一个es(\1),找到就显示该行。如果用egrep或grep -E,就不用”\”号进行转义,直接写成’w(es)t.*\1′就可以了。

5.简单实例

# grep 'the' size.txt 
the test file 
their are files 

# grep '\<the' size.txt 
the test file 
their are files 

# grep 'the\>' size.txt 
the test file 

# grep '\<the\>' size.txt 
the test file 

I# grep '\<[Tt]he\>' size.txt 
the test file

grep命令的复杂实例

  1. $ grep xm ~/Desktop/*

    在’~/Desktop’目录下搜索带字符串’xm’的文件,结果如下:

1
2
3
4
5
6
7
8
9
10
11
./xmpp.txt~:<?xmlversion='1.0'?>
./xmpp.txt~:xmlns='jabber:client'
./xmpp.txt~:xmlns:stream='http_etherx_jabber_org/streams'
grep: ./you-第三阶段: Is a directory
grep: ./服装搭配资料: Is a directory
grep: ./毕设: Is a directory
Binary file ./毕设文档.docx matches
Binary file ./王志飞论文.doc matches
grep: ./简历: Is a directory
grep: ./课件: Is a directory
grep: ./项目: Is a directory
默认情况下,’grep’只搜索当前目录。如果 此目录下有许多子目录,’grep’会以如下形式列出:

grep: sound: Is a directory

明确要求搜索子目录:grep -r
或忽略子目录:grep -d skip

如果有很多 输出时,您可以通过管道将其转到’less’上阅读:
$ grep magic /usr/src/Linux/Documentation/* | less
  1. 命令行参数

    grep -i pattern files :不区分大小写地搜索。默认情况区分大小写,

    grep -l pattern files :只列出匹配的文件名,

    grep -L pattern files :列出不匹配的文件名,

    grep -w pattern files :只匹配整个单词,而不是字符串的一部分(如匹配’magic’,而不是’magical’),

    grep -C number pattern files :匹配的上下文分别显示[number]行,

    grep pattern1 | pattern2 files :显示匹配 pattern1 或 pattern2 的行,

    grep pattern1 files | grep pattern2 :显示既匹配 pattern1 又匹配 pattern2 的行。

    grep -n pattern files 即可显示行号信息

    grep -c pattern files 即可查找总行数

    这里还有些用于搜索的特殊符号:

    \< 和 > 分别标注单词的开始与结尾。

    例如:

    grep man * 会匹配 ‘Batman’、’manic’、’man’等,

    grep ‘\<man’ * 匹配’manic’和’man’,但不是’Batman’,

    grep ‘\’ 只匹配’man’,而不是’Batman’或’manic’等其他的字符串。

    ‘^’:指匹配的字符串在行首,

    ‘$’:指匹配的字符串在行 尾,

    grep命令参数

shell_command_awk

简介

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本。

awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上 AWK 的确拥有自己的语言: AWK 程序设计语言 , 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。

使用方法

awk '{pattern + action}' {filenames}

尽管操作可能会很复杂,但语法总是这样,其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。

awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。

通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。

条用awk的三种方式

  1. 命令行方式
1
awk [-F field-separator] 'commands' input-file(s)

其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。
在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。

  1. shell脚本方式
    将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,一遍通过键入脚本名称来调用。
    相当于shell脚本首行的:#!/bin/sh
    可以换成:#!/bin/awk

  2. 将所有的awk命令插入一个单独文件,然后调用:

1
awk -f awk-script-file input-file(s)

其中,-f选项加载awk-script-file中的awk脚本,input-file(s)跟上面的是一样的。

范例

  1. 如果只是显示最近登录的5个帐号
1
2
3
4
5
6
#last -n 5 | awk '{print $1}'
root
root
root
dmtsai
root

awk工作流程是这样的:读入有’\n’换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是”空白键” 或 “[tab]键”,所以$1表示登录用户,$3表示登录用户ip,以此类推。

  1. 如果只是显示/etc/passwd的账户
1
2
3
4
5
#cat /etc/passwd |awk -F ':' '{print $1}'
root
daemon
bin
sys

这种是awk+action的示例,每行都会执行action{print $1}。

-F指定域分隔符为’:’。

  1. 如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以tab键分割
1
2
3
4
5
#cat /etc/passwd |awk -F ':' '{print $1"\t"$7}'
root /bin/bash
daemon /bin/sh
bin /bin/sh
sys /bin/sh
  1. 如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,而且在所有行添加列名name,shell,在最后一行添加”blue,/bin/nosh”。
1
2
3
4
5
6
7
8
cat /etc/passwd |awk -F ':' 'BEGIN {print "name,shell"} {print $1","$7} END {print "blue,/bin/nosh"}'
name,shell
root,/bin/bash
daemon,/bin/sh
bin,/bin/sh
sys,/bin/sh
....
blue,/bin/nosh

awk工作流程是这样的:先执行BEGING,然后读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域,随后开始执行模式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完,最后执行END操作。

  1. 搜索/etc/passwd有root关键字的所有行
1
2
#awk -F: '/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash

这种是pattern的使用示例,匹配了pattern(这里是root)的行才会执行action(没有指定action,默认输出每行的内容)。

搜索支持正则,例如找root开头的: awk -F: ‘/^root/‘ /etc/passwd

  1. 搜索/etc/passwd有root关键字的所有行,并显示对应的shell
1
2
# awk -F: '/root/{print $7}' /etc/passwd
/bin/bash

这里指定了action{print $7}

vim_command_sed

简介

sed是非交互式的编辑器。它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。

sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。具体过程如下:首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间),然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示。处理完输入文件的最后一行后,sed便结束运行。sed把每一行都存在临时缓冲区中,对这个副本进行编辑,所以不会修改原文件。

定址

定址用于决定对哪些行进行编辑。地址的形式可以是数字、正则表达式、或二者的结合。如果没有指定地址,sed将处理输入文件的所有行。

以下例子一下面的文件内容测试

test.vim

hello word !
this is a test ?
asdfghjkl
qwertyuiop
zxcvbnm
come on
he he he he
ha ha ha ha 
  1. 地址是一个数字,则表示行号,是“$”符号,则表示最后一行。
1
2
3
4
sed -n '4p' test.vim
终端只打印第四行,即:qwertyuiop
sed -n '$p' test.vim
终端只打印最后一行,即:ha ha ha ha
  1. 只显示指定行范围内的文件内容
1
2
sed -n '3,6p' test.vim
只查看文件的第3行到第6行的文件内容
  1. 逗号做分隔符,对行范围内的内容的做作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sed '2,3d' test.vim
删除第二行到第五行的内容,执行命令后的结果
//hello word !
qwertyuiop
zxcvbnm
come on
he he he he
ha ha ha ha
sed '/zx/,/he/d' test.vim
删除包含‘zx’的行到包含‘he’的行,执行命令后的结果
//hello word !
this is a test ?
asdfghjkl
qwertyuiop
ha ha ha ha
sed '/is/,4d' test.vim
删除包含‘is’的行到第四行的内容

命令与选项

sed命令告诉sed如何处理由地址指定的各输入行,如果没有指定地址则处理所有的输入行。

1. sed命令

命令 功能
a\ 在当前行后添加一行或多行。多行时除最后一行外,每行末尾需用“\”续行
c\ 用此符号后的新文本替换当前行中的文本。多行时除最后一行外,每行末尾需用”\”续行
i\ 在当前行之前插入文本。多行时除最后一行外,每行末尾需用”\”续行
d 删除行
h 把模式空间里的内容复制到暂存缓冲区
H 把模式空间里的内容追加到暂存缓冲区
g 把暂存缓冲区里的内容复制到模式空间,覆盖原有的内容
G 把暂存缓冲区的内容追加到模式空间里,追加在原有内容的后面
I 列出非打印字符
p 打印行
n 读入下一输入行,并从下一条命令而不是第一条命令开始对其的处理
q 结束或退出sed
r 从文件中读取输入行
! 对所选行以外的所有行应用命令
s 用一个字符串替换另一个
g 在行内进行全局替换
w 将所选的行写入文件
x 交换暂存缓冲区与模式空间的内容
y 将字符替换为另一字符(不能对正则表达式使用y命令)

2. sed选项

选项 功能
-e 进行多项编辑,即对输入行应用多条sed命令时使用
-n 取消默认的输出 //无-n时默认打印出文件的全部内容
-f 指定sed脚本的文件名

退出状态

sed不向grep一样,不管是否找到指定的模式,它的退出状态都是0。只有当命令存在语法错误时,sed的退出状态才不是0。

正则表达式元字符

与grep一样,sed也支持特殊元字符,来进行模式查找、替换。不同的是,sed使用的正则表达式是括在斜杠线”/“之间的模式。

如果要把正则表达式分隔符”/“改为另一个字符,比如o,只要在这个字符前加一个反斜线,在字符后跟上正则表达式,再跟上这个字符即可。例如:sed -n ‘\o^Myop’ datafile

元字符 功能 实例
^ 行首定位符 /^me/ 匹配所有以me开头的行
$ 行尾定位符 /me$/ 匹配所有以me结束的行
. 匹配换行符以外的单个字符 /m..e/ 匹配包含字母m,后跟两个任意字符,再跟字母y的行
* 匹配零个或多个前导字符 /my*/ 匹配包含字母m,后跟零个或多个e字母的行
[] 匹配指定字符组内的任一字符 /[Mm]y/ 匹配包含My或my的行
[^] 匹配不在指定字符组内的任一字符 /[^Mm]y/ 匹配包含y,但y之前的那个字符不是M或m的行
\(..\) 保存已匹配的字符 1,20s/(you)self/\1r/ 标记元字符之间的模式,并将其保存为标签1,之后可以使用\1来引用它。最多可以定义9个标签,从左边开始编号,最左边的是第一个。此例中,对第1到第20行进行处理,you被保存为标签1,如果发现youself,则替换为your。
& 保存查找串以便在替换串中引用 s/my/**&**/ 符号&代表查找串。my将被替换为**my**
\< 词首定位符 /\<my/ 匹配包含以my开头的单词的行
\> 词尾定位符 /my>/ 匹配包含以my结尾的单词的行
x\{m\} 连续m个x /9{5}/ 匹配包含连续5个9的行
x\{m,\} 至少m个x /9{5,}/ 匹配包含至少连续5个9的行
x{m,n\} 至少m个,但不超过n个 /9{5,7}/ 匹配包含连续5到7个9的行

范例

eg:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//-n 取消默认输出 分隔符也可以用
//s 命令的分隔符可以用除反斜杠,换行符以外的字符代替
sed '/he/p' test.vim //默认情况,sed把文件的所有输入行都打印在标准输出上,如果匹配he,p命令在把符合匹配规则的行再打印一便
sed -n '/he/p' test.vim //只打印匹配行
sed -n '$d' test.vim //删除最后一行
sed -n '/he/d' test.vim //删除包含 he 的行
sed -n 's/^he/me/g' test.vim (或sed -n 's#^he#me#g' test.vim )//g:全局查找,将以he开头的he替换成me
sed -n 's/he/me/g' test.vim //全局查找,将所有的he替换成me
sed -n ’1,4s/he$/me/gp' test.vim //将第一行到第四行所有以he结尾的行最后的最后一个he替换成me,并打印到屏幕上
sed -n '1,4d' -e 's/me/he/g' test.vim //e多重编译,先删除第一行到第四行的所有内容,在将所有me替换为he 注意:顺序影响最终输出结果
sed -n '/he/r text.txt' test.vim //-r 指定在特定位置读入新内容。该行命令表示:在test.vim中所有he所在行后读入text.txt文件的内容
sed -n '/he/w me.text' test.vim //将test.vim文件中包含he行写入me.txt文件中,文件me.txt不存在则创建
sed -n '/^he/a\
>adfsaf
>sdfsgf' test.vim //在以he开头的行后追加两行
sed '/hrwang/{n;s/My/Your/;}' test.vim //sed使用该命令获取输入文件的下一行,并将其读入到模式缓冲区中,任何sed命令都将应用到匹配行紧接着的下一行上。注:如果需要使用多条命令,或者需要在某个地址范围内嵌套地址,就必须用花括号将命令括起来,每行只写一条命令,或这用分号分割同一行中的多条命令。
sed '1,20y/hrwang12/HRWANG^$/' test.vim //该命令与UNIX/Linux中的tr命令类似,字符按照一对一的方式从左到右进行转换。例如,y/abc/ABC/将把所有小写的a转换成A,小写的b转换成B,小写的c转换成C. 将1到20行内,所有的小写hrwang转换成大写,将1转换成^,将2转换成$。正则表达式元字符对y命令不起作用。与s命令的分隔符一样,斜线可以被替换成其它的字符。
sed -e '/hrwang/h' -e '$G' test.vim
sed -e '/hrwang/H' -e '$G' test.vim //通过上面两条命令,你会发现h会把原来暂存缓冲区的内容清除,只保存最近一次执行h时保存进去的模式空间的内容。而H命令则把每次匹配hrwnag的行都追加保存在暂存缓冲区。
sed -e '/hrwang/H' -e '$g' test.vim
sed -e '/hrwang/H' -e '$G' test.vim //通过上面两条命令,你会发现g把暂存缓冲区中的内容替换掉了模式空间中当前行的内容,此处即替换了最后一行。而G命令则把暂存缓冲区的内容追加到了模式空间的当前行后。此处即追加到了末尾。
sed '/hrwang/{s/hrwang/HRWANG/;q;}' test.vim //q命令将导致sed程序退出,不再进行其它的处理。

sed 脚本

sed脚本就是写在文件中的一列sed命令。脚本中,要求命令的末尾不能有任何多余的空格或文本。如果在一行中有多个命令,要用分号分隔。执行脚本时,sed先将输入文件中第一行复制到模式缓冲区,然后对其执行脚本中所有的命令。每一行处理完毕后,sed再复制文件中下一行到模式缓冲区,对其执行脚本中所有命令。使用sed脚本时,不再用引号来确保sed命令不被shell解释。例如sed脚本script:

1
2
3
4
5
6
#handle test.vim
3i\
~~~~~~~~~~~~~~~~~~~~~
3,$s/\(hrwang\) is \(mjfan\)/\2 is \1/
$a\
We will love eachother forever!!
1
2
3
4
5
6
7
#sed -f script test.vim
My name is hrwang
Your name is mjfan
~~~~~~~~~~~~~~~~~~~~~
mjfan is hrwang's husband. #啦啦~~~
mjfan is hrwang's wife.
We will love eachother forever!!

create_certificate

others’ blog

生成certSigningRequest文件

该文件是MAC系统生成的,用于在Apple网站上申请推送证书文件。

打开应“钥匙串访问”软件,菜单->钥匙串访问->证书助理->从证书颁发机构请求证书,填写邮箱和名称(随便写),选择保存到磁盘,此时会生成一个CertificateSigningRequest.certSigningRequest文件。

注册一个支持Push的app id

进入developer.apple.com,选择member center-certificates,Identifier & profiles-identifiers-App ids,注册app id,设置app id名称。同时qpp id suffix一栏选择explicit app id,设置bundle id。勾选App Services中得Push Notifications,这样就可以注册一个支持push app id。

生成cer文件

该文件用于生成服务端需要的文件。

生成过程:进入developer.apple.com,选择member center-certificates,Identifier & profiles-certificates,然后创建certificate,类型分为Development 和 Product。eg:Development,选择Apple Push Notification service SSL (Sandbox) ,选择之前生成的支持push的Appid,然后提交之前创建的CSR文件,生成cer文件,保存到本地。

生成服务器端的证书文件

如果使用网上的mac版PushMeBaby工具,在Mac机器上进行推送使用上面的cer就可以了,如果使用PHP、java/c#开发服务端,需要将cer转换生成pem或p12文件。

在应用服务器采用php的方式将消息推送给APNS,

php连接APNS也是需要证书的,打开终端,对上面的证书做如下处理,

cd  进入证书所在目录

把.cer文件转换成.pem文件:

$ openssl x509 -in aps_developer_identity.cer -inform der
-out PushCert.pem
把私钥Push.p12文件转换成.pem文件:

$ openssl pkcs12 -nocerts -out PushKey.pem -in Push.p12
Enter Import Password:
MAC verified OK
Enter PEM pass phrase:
Verifying – Enter PEM pass phrase:
你首先需要为.p12文件输入passphrase密码短语,这样OpenSSL可以读它。然后你需要键入一个新的密码短语来加密PEM文件。还是使用”pushchat”来作为PEM的密码短语。你需要选择一些更安全的密码短语。

注意

如果你没有键入一个PEM passphrase,OpenSSL将不会返回一个错误信息,但是产生的.pem文件里面将不会含有私钥。

最后。把私钥和证书整合到一个.pem文件里:

$ cat PushCert.pem PushKey.pem > ck.pem
为了测试证书是否工作,执行下面的命令:

$ telnet gateway.sandbox.push.apple.com 2195
Trying 17.172.232.226Connected to gateway.sandbox.push-apple.com.akadns.net.
Escape character is ‘^]’.
它将尝试发送一个规则的,不加密的连接到APNS服务。如果你看到上面的反馈,那说明你的MAC能够到达APNS。按下Ctrl+C 关闭连接。如果得到一个错误信息,那么你需要确保你的防火墙允许2195端口。

然后再次连接,这次用我们的SSL证书和私钥来设置一个安全的连接:

$ openssl s_client -connect gateway.sandbox.push.apple.com:2195
-cert PushChatCert.pem -key PushChatKey.pem
Enter pass phrase for PushChatKey.pem:
你会看到一个完整的输出,让你明白OpenSSL在后台做什么。如果连接是成功的,你可以键入一些字符。当你按下回车后,服务就会断开连接。如果在建立连接时有问题,OpenSSL将会给你一个错误消息,

ck.pem文件就是我们需要得到php连接APNS 的文件,将ck.pem和push.php放入同一目录上传到服务器。

生成Xcode使用的provisioning文件

该文件用于真机调试。

生成过程:进入developer.apple.com,选择member center-certificates,Identifier & profiles-provisioning profiles,然后创建provi file。选择iOS App Development->AppId->选中之前生成的支持push的appid->选中支持的push的certi->勾选支持的device id->设置provisioning文件的文件名,即完成provisioning文件的生成。