Linux文本处理-grep,vim,nano,sed,awk

1. grep, egrep, fgrep - print lines matching a pattern   行模式匹配

使用用法如下:

grep [OPTIONS] PATTERN [FILE...]

 grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

模式选择项:

-E:使用扩展的正则表达式

-F :使用固定字符串进行匹配

-G :使用基本正则表达是

-P :使用perl正则表达式

匹配控制:

-e PATTERN  : 使用指定的PATTERN 进行匹配,可以指定多个-e选项进行匹配的,仅使用于符合posix的接口的

-f FILE:匹配文件的内容,从文件的每一行进行匹配操作,仅适用于符合posix的接口的

-i:忽略大小写

-v:获取不匹配的行

-w:单词匹配

-x:显示完全匹配一整行的

输出控制: 

-m NUM: 匹配多少次之后就不再进行匹配操作的

-o:仅显示匹配到的内容

输出前缀控制

-n:打印行号

输出文本控制

-A NUM:输出文本后面增加num的输出

-B NUM:输出文本的前面增加num的输出

--group-separator:指定输出分隔符

文件和目录选择:

-D ACTION:对设备文件的处理,默认是read,可指定为skip

-d ACTION:对目录的处理,默认是read,可指定skip等操作

--binary-files=TYPE:二进制文件,按照指定的type类型进行处理

--exclude:不读取符合指定的glob风格的文件

--exclude-from:跳过文件基名符合任何的glob风格的信息的

--exclude-dir:派出指定的目录信息

--include=GLOB:知识搜索指定的文件

-r:递归搜索,如果是目录的话,可以递归搜索文件下面所有的文件

正则表达式使用语法

[]:匹配中括号中的任意的单个字符

[^]:匹配中括号以外的内容

[a-d]:等于[adcd]

[:alnum:]:所有的数字和字母

[:alpha:]:所有的字母

 [:cntrl:]:

 [:digit:]:数字

 [:graph:]:

 [:lower:]:匹配小写字母

 [:print:];

  [:punct:];

 [:space:];

 [:upper:]; 匹配大写字母

 [:xdigit:]

位置锚定:

^:表示开头

$:表示结尾

单词锚定

\<:锚定单词开头

\>:锚定单词结尾

\b:锚定单词尾部空的字符串

\B:锚定不是单词尾部的空字符串

\w:等于[_[:alnum:]]

\W:等于[^_[:alnum:]]

可复用操作符

?:最多一次

*:0或多次

+:一次或者多次

{n}:匹配n次

{n,}:至少匹配n次

{,m}:之多匹配m次

{n,m}:至少n次,至多m次

多个模式的拼接采用|进行操作。转义操作\n表示的是单个字符n,不是换行的意思。

基本正则表达式和扩展正则表达式的对比

基本的正则表达式使用如下的字符代替原来的字符,原来的字符失去了意义的:

\?:?

\+:+

 \{:{

 \|;  |

\(:(

\):)

扩展的正则表达式中,不要出现{,应该使用[{] 来代替{。

下面是使用示例

[root@mrzhang ~]# grep -i -o '\' /etc/passwd    // 不区分大小写,仅显示匹配到的单词

[root@mrzhang ~]# grep -v '\' /etc/passwd    // 显示不包含root的行

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

[root@mrzhang ~]# grep '\<\(root\)\|\(fedora\)\|\(user1\)\>' /etc/passwd    // 显示匹配root用户,fedora用户,user1用户的信息的。

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

fedora:x:1009:1009::/home/fedora:/bin/bash

user1:x:1010:1010::/home/user1:/bin/bash

[root@mrzhang ~]# grep '\' /etc/passwd    // 进行多个模式的匹配连接的字符串信息的

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

fedora:x:1009:1009::/home/fedora:/bin/bash

user1:x:1010:1010::/home/user1:/bin/bash

[root@mrzhang ~]# grep -e '\' -e '\' -e '\' /etc/passwd     // 使用多模式匹配,需要注意的是-e和-f只能够出现一个的。

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

fedora:x:1009:1009::/home/fedora:/bin/bash

[root@mrzhang ~]# grep -o '\<[[:alpha:]]\+\>()' /etc/rc.d/init.d/functions

checkpid()

daemon()

echo "/etc/rc.d/init.d/functions" | grep -o '/.*/'   // 匹配目录名称,和dirname的作用是一样的

[root@mrzhang ~]# echo "/etc/rc.d/init.d/functions" | grep -o '/.*/'

/etc/rc.d/init.d/

[root@mrzhang ~]# dirname /etc/rc.d/init.d/functions

/etc/rc.d/init.d

获取基名

[root@mrzhang ~]# basename /etc/rc.d/init.d/functions

functions

[root@mrzhang ~]# echo "/etc/rc.d/init.d/functions" | grep -o '/[^/]*' | tail -n 1    // 切割获取基名,类似的效果如同basename

[root@mrzhang ~]# echo "/etc/rc.d/init.d/functions" | grep -o '/[^/]*' | tail -n 1

/functions

[root@mrzhang ~]# basename /etc/rc.d/init.d/functions

functions

[root@mrzhang ~]# ifconfig | grep '\<[1-9]\>\|\<[1-9][0-9]\>\|\<[1][0-9][0-9]\|\<[2][0-5][0-5]\>'  // 查找获取1-255之间的数字,可以实现获取ip地址等信息的街区操纵管理实现的。

ens33: flags=4163  mtu 1500

inet 192.168.8.121  netmask 255.255.255.0  broadcast 192.168.8.255

2.vim :文本编辑器,使用语法如下

vim [options] [file ..]

vim [options] -

vim [options] -t tag

vim [options] -q [errorfile]

+num:指向第num行的开头

+/pattern  :指向的是第一次匹配pattern的地方

+{command}:第一次打开文件的时候执行的动作:

[root@mrzhang ~]# vim "+set nu" fstab    // 打开文件的同时设置行号

-{command}:第一次打开文件的时候取消特性   // 很少使用

--cmd {command}:打开文件之前设置执行多个命令,最多10个   // 很少使用

其中vim专门的操作指令可以使用如下的信息进行提示: vimtutor   查看即可

其中常见的操作信息如下:

x:删除光标处的字符信息

i:插入文本信息,在字符后面追加

A:追加文本,在字符前面进行追加

wq:保存

dw:删除单个单词(指的是删除到下一个单词的开头)

d$:删除光标到行尾的所有

上面的操作可以结合数字进行操作的,如3dw可以一次删除3个单词的。

dd:删除一整行

u:撤销上一次的操作

p:将上一次复制的内容粘贴到光标所在的后面

rx:替代操作

.. 后面的还有很多的操作,可以使用 vimtutor 查看和获取帮助的。在vimtutor中可以使用模式进行搜索的。

下面展示的主要是地址定界和替换等的相关的操作信息的(使用%s)

%s@^[[:space:]]\+@@g   //将文件开头的空格删除,对应的使用的是基本的正则表达式的

%s@^#[[:space:]]\+@@g   // 将行首为#,后面跟上一个或者多个空白字符删除

3.nano:不是很常用,文本编辑器,语法如下:

nano [OPTIONS] [[+LINE,COLUMN] FILE]...

+num:跳转到指定的行的其实位置

其他的参见打开文件后的也买你提示信息的

关闭文件

ctrl+x  执行两次即可

ctrl+o 保存,然后ctrl+x退出

4.sed:过滤和文本转化的流编辑器,使用用法如下:

sed [OPTION]... {script-only-if-no-other-script} [input-file]...

常用的选项信息如下:

-e script: 执行的脚本信息

-f script-file:执行的脚本文件

-r:在脚本中使用扩展的正则表达式

s/regexp/replacement/  :替换操作

w filename  将当前行写入到文件中

W filename: 将模式空间中的第一行写入到文件中

y/source/dest/   将source中出现的匹配的内容转换为目标内容实现

r filename:从文件中读取内容

R filename:从文件中读取一行进行追加

常用的地址定界操作信息如下:

number:只当的行号

first~step:起始位置和步长信息

$:最后一行的信息

/regexp/:匹配正则表达式的行信息

0,addr:从开始到地址addr

addr1,+N:地址addr1和后面的N行信息

addr1,~N  : 地址addr1和N之间的多行信息

上面的多个选项,在实际的使用中是需要结合地址定界进行处理实现的。

下面是使用示例

[root@mrzhang tmp]# sed 's/^[[:space:]]\+//g' grub2.cfg    // 将文件首部的空格删除操作

[root@mrzhang tmp]# sed 's@^#[[:space:]]\+@@g' grub2.cfg    // 删除#开头的行

[root@mrzhang tmp]# sed '1~2w /tmp/grub' grub2.cfg   // 将文件grub2.cfg的奇数行写入到/tmp/grub文件中

[root@mrzhang ~]# echo "/etc/sysconfig/network-scripts" | sed 's@/.*/@@'   // 获取基名

[root@mrzhang ~]# echo "/etc/sysconfig/network-scripts" | sed 's@/.*[^/].*/@@'    // 获取基名信息

network-scripts

[root@mrzhang ~]# echo "/etc/sysconfig/network-scripts" | sed 's@[^/]\+/\?$@@'    // 获取基名

或者是采用如下的方式

[root@mrzhang ~]# echo "/etc/sysconfig/network-scripts" | sed 's@[^/]*$@@'  // 获取目录名称信息也可。

你可能感兴趣的:(Linux文本处理-grep,vim,nano,sed,awk)