grep 正则表达式 vim

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了grep 正则表达式 vim相关的知识,希望对你有一定的参考价值。

一:umask:

  当我们登录系统之后创建一个文件总是有一个默认权限的,那么这个权限是怎么来的呢?这就是umask干的事情。umask设置了用户创建文件的默认 权限,它与chmod的效果刚好相反,umask设置的是权限"补码",而chmod设置的是文件权限码。一般可在/etc/profile、/etc/bashrc、$ [HOME]/.bash_profile、$[HOME]/.profile或$[HOME]/.bashrc中设置umask值。具体取决于Linux发行版。

     修改方式为:umask xxx,这种方式修改后不能长期存在(类似于系统的变量),要想一直存在,umask值可以存储在/etc/bashrc当中,使所有用户均被设置,也可以存在~/.bashrc只对某用户设置。

二:grep 

--color=auto 关键字高亮显示

-v 反向搜索

-i 忽略大小写

-n 显示行号

-c 不显示搜索结果,仅显示匹配的行数

-o 仅显示匹配到的字符串

-q 静默输出

    grep -q root /etc/passwd  

    echo $? 

    若$?为0表示执行成功若结果为1,表示未找到该字符串

    grep -q root /etc/passwd && echo 找到了 ||echo 未找到 

    grep -q root /etc/passwd &> /dev/null && echo 找到了 ||echo 未找到 

    以上两个例子效果相同原理不一。要注意。

-A #  显示搜索行及其向下相临的#行

-B #  显示搜索行及其向上相临的#行

    例子:nmap -v -sP 172.18.250.0/24 |grep -B1 'Host is up' |grep for |cut -d" " -f5

-C #  显示搜索行及其向上和向下相临的#行

-e char1 -e char2 [-e charN] 多个选项间or关系

-w 匹配整个单词

-E 或egrep 支持扩展正则表达式

-F 或fgrep 不支持正则表达式

grep "$USER" /etc/passwd :显示变量;

grep '$USER' /etc/passwd :显示字符串$USER

grep    `whoami` /etc/passwd :显示命令执行的结果

三:正则表达式

    正则表达式由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能。grep、awk、sed等命令可以支持正则表达式。

    元字符分类:字符匹配,匹配次数,位置锚定,分组。

    

例子:去除配置文件中的注释行和空白行

    grep -v "^#\|^[[:blank:]]*$" /etc/httpd/conf/httpd.conf

    通配符用来匹配符合条件的文件名,通配符是完全匹配。ls、find、cp这些命令不支持正则表达式,所以只能使用shell自己的通配符来进行匹配了。通配符必须是完全匹配

通配符


元字符作用
*匹配0个或任意多个字符,也就是可以匹配任何内容
匹配任意一个字符
[]匹配[ ]中任意一个字符
[-]匹配括号中任意一个字符,-代表一个范围,例如:[a-z]代表匹配一个小写字母
[^]逻辑非,表示匹配不是中括号内的一个字符,例如[^0-9]代表匹配一个不是数字的字符


基础正则表达式


元字符作用
*前一个字符匹配0次或任意多次,匹配0次前一个字符则表示匹配任意字符,包括空白行
.匹配除了换行符以外任意一个字符,“.*”匹配所有内容
^用于指定匹配字符串的头部,也称行首定位符;匹配行首。例如:^hello会匹配以hello开头的行,grep -n “^$” test.txt匹配空白行并显示行号
$用于指定匹配字符串的尾部,也称行尾定位符;匹配行尾。例如:hello$会匹配以hello结尾的行
[]匹配中括号中指定的任意一个字符,只匹配一个字符,要匹配[则要转义\[
[^]匹配除中括号的字符以外的任意一个字符
\转义符用于取消特殊符号的含义,匹配包含以.结尾的行grep “\.$” test.txt
\{n\}表示其前面的字符恰好出现n次。例如:[0-9]\{4\}匹配4位数字,但注意添加两边的定界符,以精确匹配
\{n,\}表示其前面的字符出现不小于n次。例如:[0-9]\{2,\}匹配2位以上的数字
\{,n\}表示其前面的字符出现不大于n次。例如:[0-9]\{,2\}匹配2位以下的数字
\{n,m\}表示其前面的字符至少出现n次,最多出现m次。例如:[a-z]\{6,8}匹配6到8位的小写字母

元字符

描述

[:lower:]

小写字母

[:upper:]

大写字母

[:alpha:]

所有字母

[:digit:]

数字

[:alnum:]

所有数字和字母

[:punct:]

标点符号

[:space:]

空白字符

\?

匹配其前面的字符1次或0次

\+匹配其前面的字符至少1次

^$(^[:space:]*$)

表示空行(空白行)

\<或\b

铆定词首,其后面的任意字符必须作为单词的首部出现

\>或\b

铆定词尾,其前面的任意字符必须作为单词的尾部出现

\(\)

分组

\(ab\)*

ab作为一个整体,可以出现任意次

\(ab\).*\1

引用第一个左括号以及与之对应的右括号所包括的所有内容

\(ab\).*\2

引用第二个左括号以及与之对应的右括号所包括的所有内容


扩展正则表达式


元字符作用
|管道符,表示“或”,即匹配其中任何一个,”book|desk”将匹配”book”或”desk”
-减号,用于指明字符范围, “[a-c]”将匹配包含a、b和c中任意一个字符的字符串

字符匹配

.

匹配任意单个字符

[]

匹配指定范围内的任意单个字符

[^]

匹配指定范围外的任意单个字符

次数匹配

*

匹配其前字符任意次

?

匹配其前字符0次或1次

+

匹配其前字符至少1次,类似于基本正则表达式\{1,\}

{m,n}

匹配其前面的字符至少m次,至多n次

位置铆定

^

行首

$

行尾

\<或\b

词首

\>或\b

词尾

分组

().*\1\2\3


或者

|

or  a|b ,a或者b ,有一个就行

C|cat--> C或cat

(C|c)at-->Cat或cat

单引号’’强引用,不做变量替换的

双引号””弱引用,内部的变量会替换

四:非贪婪匹配

贪婪匹配 
在满足匹配时,匹配尽可能长的字符串,默认情况下采用贪婪匹配

string pattern1 = @"a.*c";   // greedy match Regex regex = new Regex(pattern1);
regex.Match("abcabc"); // return "abcabc" 123

非贪婪匹配 
在满足匹配时,匹配尽可能短的字符串,使用?表示非贪婪匹配

string pattern1 = @"a.*?c";   // non-greedy match Regex regex = new Regex(pattern1);
regex.Match("abcabc"); // return "abc"1234

几个常用的非贪婪匹配Pattern

      • *? 重复任意次,但尽可能少重复

      • +? 重复一次货更多次,但尽可能少重复

      • ?? 重复0次或1次,但尽可能少重复

      • {n, m}? 重复n到m次,但尽可能少重复

      • {n,}? 重复n次以上,但尽可能少重复

  • 练习:

1、显示/proc/meminfo文件中以大小s开头的行(要求:使用两种方法)

cat /proc/meminfo |grep "^s\|S"

cat /proc/meminfo |grep -i ^s

grep ^[sS] /proc/meminfo

grep -e ^s -e ^S /proc/meminfo

2、显示/etc/passwd文件中不以/bin/bash结尾的行

cat /etc/passwd  |grep -v "/bin/bash$"

3、显示用户rpc默认的shell程序

grep -w "^rpc" /etc/passwd |cut -d: -f7

4、找出/etc/passwd中的两位或三位数

cat /etc/passwd | grep  -o "\<[[:digit:]]\{2,3\}\>"

5、显示CentOS7的/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面存非空白字符的行

cat /etc/grub2.cfg | grep "^[[:space:]]\+[^[:space:]]"

6、找出“netstat -tan”命令的结果中以‘LISTEN’后跟任意多个空白字符结尾的行

netstat -tan | grep "LISTEN[[:space:]]\+$"

7、显示CentOS7上所有系统用户的用户名和UID

cat /etc/passwd |cut -d: -f1,3 | grep "\<[0-9]\{1,3\}\>"

8、添加用户bash、testbash、basher、sh、nologin(其shell为/sbin/nologin),找出/etc/passwd用户名同shell名的行

cat /etc/passwd | grep "\(^.*\)\>.*\<\1$"

9、利用df和grep,取出磁盘各分区利用率,并从大到小排序

df | grep -o "[0-9]\{1,3\}%" | grep -o "[0-9]\+" | sort -nr

df |grep "^/dev/sd" |grep -o "[[:digit:]]\{1,3\}%" |tr -d % |sort -nr

作业:

1、显示三个用户root、mage、wang的UID和默认shell

cat /etc/passwd|cut -d: -f1,3|grep -e "root\>" -e "mage"\ -e "wang\>"

2、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行

grep "(^[[:alpha:]]+|^_+.*)\(\)" /etc/rc.d/init.d/functions

3、使用egrep取出/etc/rc.d/init.d/functions中其基名

 echo /etc/rc.d/init.d/functions | egrep -o "[^/]+$"

4、使用egrep取出上面路径的目录名

echo /etc/rc.d/init.d/functions | egrep -o "^.*\/" | egrep -o "^.*[^/]" 

5、统计last命令中以root登录的每个主机IP地址登录次数

last |egrep "\<root\>" |tr -s " "|cut -d " " -f1,3|sort|uniq -c

6、利用扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255

[0-9] [1-9][0-9] 1[0-9]{2} 2[0-4][0-9] 25[0-5]

7、显示ifconfig命令结果中所有IPv4地址

ifconfig |grep "inet\b"|tr -s " "|cut -d" " -f3

8、将此字符串:welcome to  magedu linux 中的每个字符去重并排序,重复次数多的排到前面

echo welcome to  magedu linux |grep -o [[:alpha:]]|sort|uniq  -c|sort -rn


四:vim

三种主要模式

命令模式 (default): 移动光标,复制,剪切,粘贴,撤销,重做,搜索,进入其他模式

  移动光标:

    h向左移动

    l向右移动

    j向下移动

    k向上移动

    配合#h,#l,#j,#k可一次性移动#个字符

    w跳到下一个单词的词首

    b跳到上一个单词的词首

    H跳到当前页首

    M跳到当前页中

    L跳到当前页尾

    gg跳到整个文件的首行

    G跳到整个文件的末行

    ^移到非空格开头的行首

    $移到行尾

    #G跳到指定行,或退出模式下:#

    Ctrl+f: 向文件尾部翻一屏

    Ctrl+b: 向文件首部翻一屏

    Ctrl+d: 向文件尾部翻半屏

    Ctrl+u:向文件首部翻半屏

    r替换一个字符

  d剪切

    dd剪切当前行

    #dd剪切#行

    dw剪切一个单词

    d^从光标所在处剪切到行首

    d$或D从光标所在处剪切到行尾

    

  y复制

    yy或Y复制当前行

    #yy复制#行

    yw复制一个单词

    y^从光标所在处复制到行首

    y$从光标所在处复制到行尾


  p粘贴

    p当前行向下粘贴或光标所在处向后粘贴

    P当前行向上粘贴或光标所在处向前粘贴

    替换模式 R进入 Esc退出

    

  从命令模式进入插入模式

    i光标在哪从哪进入

    I光标移至行首同时进入插入模式

    a光标向后移一个字符同时进入插入模式

    A光标移至行尾同时进入插入模式

    o光标向下插入一新行同时进入插入模式

    O光标向上插入一新行同时进入插入模式

插入模式:文本编辑

    退出模式:保存、退出

    w:保存

    q:退出

    q!强制退出

    wq或x 保存并退出

    w!当前用户为该文件所属人时,如果该文件为read only,可加上!强制保存。

    在退出模式下返回命令模式EscEsc或Enter

    r /path/filename 读取另一个文件的内容并将输出结果写入文件

    w /path/filename 另存为(确认当前用户对该路径中的最后一级目录有wx权限)

    ! command 执行某条命令,将输出结果显示在终端上

    r! command 执行某条命令,在光标所在的当前行向下插入新行并将输出结果输入

    .! command 执行某条命令,替换光标所在的当前行并将输出结果输入

    搜索

    /关键字 

    n向下找

    N向上找

    ?关键字

    n向上找

    N向下找

    

    

例子:

dog pig dog cat dog

pig dog root dog cat

dog linux roat dog cat

pig root dog cat dog pig

fish dog rooter pig dog

bird dog cat rbbt pig


把以上内容中的rxxt换成rxxter,已经是rxxter的不变

%[email protected]\(r..t\)\>@\[email protected]


http://mirrors.163.com/  换成https://mirrors.sina.com/dvd


:%[email protected]://[email protected]://mirrors.sina.com/[email protected]


作业:

1、复制/etc/profile至/tmp/目录,用查找替换命令删除/tmp/profile文件中的行首的空白字符

:%[email protected]^[[:blank:]]\[email protected]@g

2、复制/etc/rc.d/init.d/functions文件至/tmp目录,用查找替换命令为/tmp/functions的每行开头为空白字符的行的行首添加一个#号

:%[email protected]\(^[[:blank:]]\+\)@#\[email protected]   



以上是关于grep 正则表达式 vim的主要内容,如果未能解决你的问题,请参考以下文章

grep 正则表达式 vim

文本处理(grep,vim),正则表达式

使用awk / grep / sed / bash / vim进行正则表达式匹配和打印

grep & 正则表达式

grep用法

grep 和vim用法