Linux之特殊符号与正则表达式

Posted 游小刀

tags:

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

Linux中常用的特殊符号

\'\'     所见即所得,吃啥吐啥
""     特殊符号会被解析运行
``     ==== $() 先运行里面的命令 把结果留下

>     重定向符号        先清空文件的内容 然后追加文件的最后
>>    追加重定向        追加文件的最后
2>    错误重定向        只有错误的信息 才会通过这个漏洞进入文件中
2>>   错误追加重定向

~     当前用户的家目录
root   ~ /root
oldboy ~ /home/oldboy
!     查找并运行历史命令
!awk  包含awk的命令 最近的一条运行
      history |grep awk
#     注释
      root用户的命令提示符

$     取出变量的内容
      awk $取某一列的内容
      普通用户的命令提示符
*     所有 任何东西
\\     撬棍  转义字符

&&    前一个命令执行成功然后在执行后一个命令
      ifdown eth0 && ifup eth0


||    前一个命令支持失败了再执行后面的命令

通配符

通配符是用来查找文件的。如:‘*.txt’ 表示匹配所有以  . txt结尾的文件
##1. * 所有,任意 找出文件名包含oldboy的文件 mkdir -p /oldboy cd /oldboy touch oldboy.txt oldboy oldboyfile oldboy.awk eduoldboy [root@oldboyedu01-nb oldboy]# find /oldboy/ -type f -name "oldboy" /oldboy/oldboy [root@oldboyedu01-nb oldboy]# find /oldboy/ -type f -name "*oldboy" /oldboy/oldboy /oldboy/eduoldboy [root@oldboyedu01-nb oldboy]# find /oldboy/ -type f -name "*oldboy*" /oldboy/oldboyfile /oldboy/oldboy.txt-hard /oldboy/oldboy.awk /oldboy/oldboy.txt /oldboy/oldboy /oldboy/eduoldboy ##2. {} 生成序列 [root@oldboyedu01-nb oldboy]# echo {1..6} 1 2 3 4 5 6 [root@oldboyedu01-nb oldboy]# echo {1..10} 1 2 3 4 5 6 7 8 9 10 [root@oldboyedu01-nb oldboy]# echo {a..z} a b c d e f g h i j k l m n o p q r s t u v w x y z [root@oldboyedu01-nb oldboy]# echo {a..z} a b c d e f g h i j k l m n o p q r s t u v w x y z [root@oldboyedu01-nb oldboy]# echo {01..10} 01 02 03 04 05 06 07 08 09 10 [root@oldboyedu01-nb oldboy]# echo stu{01..10} stu01 stu02 stu03 stu04 stu05 stu06 stu07 stu08 stu09 stu10 [root@oldboyedu01-nb oldboy]# echo 20{01..10} 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 [root@oldboyedu01-nb oldboy]# [root@oldboyedu01-nb oldboy]# echo {1,9,20} 1 9 20 #通过{}进行备份 [root@oldboyedu01-nb oldboy]# echo A{B,C} AB AC [root@oldboyedu01-nb oldboy]# echo A{,C} A AC [root@oldboyedu01-nb oldboy]# echo oldboy.txt{,.bak} oldboy.txt oldboy.txt.bak [root@oldboyedu01-nb oldboy]# touch oldboy.txt [root@oldboyedu01-nb oldboy]# cp oldboy.txt{,.bak} [root@oldboyedu01-nb oldboy]# ls -l oldboy.txt* -rw-r--r--. 2 root root 29 Oct 18 07:42 oldboy.txt -rw-r--r-- 1 root root 29 Oct 18 07:42 oldboy.txt.bak -rw-r--r--. 2 root root 29 Oct 18 07:42 oldboy.txt-hard lrwxrwxrwx 1 root root 10 Oct 17 09:27 oldboy.txt-soft -> oldboy.txt [root@oldboyedu01-nb oldboy]# cp oldboy.txt{,.bak} [root@oldboyedu01-nb oldboy]# #cp oldboy.txt{,.bak} [root@oldboyedu01-nb oldboy]# echo oldboy.txt{,.bak} oldboy.txt oldboy.txt.bak [root@oldboyedu01-nb oldboy]# echo A{,B} A AB

 

正则表达式

1)什么是正则?为何使用它?
  通过符号表示文字内容。

  提高效率,省事。
  支持正则表达式:Linux三剑客 grep sed awk

2)使用正则的时候注意事项
    #1] 正则表达式是按照行进行处理的
    #2] 禁止使用中文符号
    #3] 给grep和egrep配置别名
cat >>/etc/profile<<EOF
alias grep=\'grep --color=auto\'
alias egrep=\'egrep --color=auto\'
EOF

source /etc/profile

 

正则与统配符的区别

  用途                                 匹配的内容                       支持的命令
  通配符---用来匹配查找文件名      *.txt *.log 以.txt .log结尾的文件    大部分命令都可以使用
  正则-----在文件中匹配查找内容    包含oldboy的行                       Linux三剑客

 

正则表达式的分类

      名称                                       符号                     命令
基础正则(basic regular expression BRE) ^ $ . * [] [^] grep sed awk 扩展正则(extended regular expression ERE) | + {} () ? grep -E/egrep sed -r awk

 

基础正则

 

准备测试环境
I am oldboy teacher!
I teach linux.

I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.

not 4900000448.
my god ,i am not oldbey,but OLDBOY!

 

#1].  ^  以....开头的行
[root@oldboyedu01-nb oldboy]# grep \'^m\' oldboy.txt
my blog is http://oldboy.blog.51cto.com
my qq num is 49000448.
my god ,i am not oldbey,but OLDBOY!

#2].  $  以....结尾的行
[root@oldboyedu01-nb oldboy]# grep \'m$\' oldboy.txt
my blog is http://oldboy.blog.51cto.com

#3].  ^$ 空行 这一行中没有任何的符号
[root@oldboyedu01-nb oldboy]# grep -n \'^$\' oldboy.txt
3:
8:

排除文件中的空行
[root@oldboyedu01-nb oldboy]# grep  -v \'^$\' oldboy.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY!

#4].  .(点)  任意一个字符 不包含空行
    #-o 表示grep的执行过程 正则每次匹配到了什么?

    找出文件中以点结尾的行
[root@oldboyedu01-nb oldboy]# grep \'.$\' oldboy.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
因为 . 是正则符号,所以并没有匹配出我们需要的内容。我们需要使用\\将其转义
#5].  \\(撬棍)  转义符号  脱掉马甲,打回原形
[root@oldboyedu01-nb oldboy]# grep \'\\.$\' oldboy.txt
I teach linux.
my qq num is 49000448.
  # \\n     表示回车换行

#6].  *  前一个字符连续出现了0次或1次以上  >=0
    A
    AA
    AAA
    AAAA
[root@oldboyedu01-nb oldboy]# grep \'0\' oldboy.txt
my qq num is 49000448.
not 4900000448.
[root@oldboyedu01-nb oldboy]# grep -o \'0\' oldboy.txt
0
0
0
0
0
0
0
0

[root@oldboyedu01-nb oldboy]# grep \'0*\' oldboy.txt
I am oldboy teacher!
I teach linux.

I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.

not 4900000448.
my god ,i am not oldbey,but OLDBOY!
[root@oldboyedu01-nb oldboy]#
[root@oldboyedu01-nb oldboy]# grep -o \'0*\' oldboy.txt
000
00000

Linux正则表达式之问题1.
为何会取出000 而不是
00 和0 0 0 0 #因为正则在表示 连续出现的时候表现出贪婪性 有多少吃多少 有多少匹配多少 Linux正则表达式之问题2.
为何使用
\'0*\' 会把整个文件的内容都显示出来 #A*表示 # 连续出现了0次A ====>相当于什么也没有,就像是在匹配 ‘ ’ 。因此就会把整个文件的内容都显示出来 # A连续出现了1次以上 A # 小结: 什么是连续出现 -o的使用 #7]. .* 所有字符 所有符号 所有 #正则中表示连续出现 或 所有的时候 贪婪性 有多少匹配多少 找出文件中以m开头的行并且以m结尾的行 [root@oldboyedu01-nb oldboy]# grep \'^m.*m$\' oldboy.txt my blog is http://oldboy.blog.51cto.com #8]. [] 中括号 [abc] 相当于是一个字符 找出包含a或b或c的行 [root@oldboyedu01-nb oldboy]# grep \'[abc]\' oldboy.txt I am oldboy teacher! I teach linux. I like badminton ball ,billiard ball and chinese chess! my blog is http://oldboy.blog.51cto.com our site is http://www.etiantian.org my god ,i am not oldbey,but OLDBOY! [root@oldboyedu01-nb oldboy]# grep -on \'[abc]\' oldboy.txt 1:a 1:b 1:a 1:c 2:a 2:c grep \'[a-z]\' oldboy.txt grep \'[A-Z]\' oldboy.txt grep \'[0-9]\' oldboy.txt grep \'[a-zA-Z0-9]\' oldboy.txt 练习3:以 m或n或o开头的 并且以 m或g 结尾的行 [root@oldboyedu01-nb oldboy]# grep \'^[mno].*[mg]$\' oldboy.txt my blog is http://oldboy.blog.51cto.com our site is http://www.etiantian.org [root@oldboyedu01-nb oldboy]# grep \'[m,n,o]\' oldboy.txt I am oldboy teacher! I teach linux. I like badminton ball ,billiard ball and chinese chess! my blog is http://oldboy.blog.51cto.com our site is http://www.etiantian.org my qq num is 49000448. not 4900000448. my god ,i am not oldbey,but OLDBOY! #9]. [^] [^abc] 排除a或b或c的内容 [root@oldboyedu01-nb oldboy]# grep \'[^abc]\' oldboy.txt I am oldboy teacher! I teach linux. I like badminton ball ,billiard ball and chinese chess! my blog is http://oldboy.blog.51cto.com our site is http://www.etiantian.org my qq num is 49000448. not 4900000448. my god ,i am not oldbey,but OLDBOY! #10].基础正则小结 ##1)) ^ $ ^$ . * .* [] [^] ##2)) grep grep -o

 

扩展正则

+  | () {} ?

 

    #1].  +前一个符号连续出现了1次或多次  ,贪婪匹配,尽可能多的匹配
[root@oldboyedu01-nb oldboy]# egrep  \'0\' oldboy.txt
my qq num is 49000448.
not 4900000448.
[root@oldboyedu01-nb oldboy]# egrep  \'0+\' oldboy.txt
my qq num is 49000448.
not 4900000448.
[root@oldboyedu01-nb oldboy]# egrep  \'0+\' oldboy.txt -o
000
00000
[root@oldboyedu01-nb oldboy]# egrep  \'0\' oldboy.txt -o
0
0
0
0
0
0
0
0
符号 + 的应用
#把文件中连续出现的小写字母取出来     #1.取出小写字母 [root@oldboyedu01-nb oldboy]# egrep \'[a-z]\' oldboy.txt I am oldboy teacher! I teach linux. I like badminton ball ,billiard ball and chinese chess! my blog is http://oldboy.blog.51cto.com our site is http://www.etiantian.org my qq num is 49000448. not 4900000448. my god ,i am not oldbey,but OLDBOY!     #2.连续出现的小写字母 [root@oldboyedu01-nb oldboy]# egrep \'[a-z]+\' oldboy.txt I am oldboy teacher! I teach linux. I like badminton ball ,billiard ball and chinese chess! my blog is http://oldboy.blog.51cto.com our site is http://www.etiantian.org my qq num is 49000448. not 4900000448. my god ,i am not oldbey,but OLDBOY!     #3.只保留连续出现的小写字母 [root@oldboyedu01-nb oldboy]# egrep \'[a-z]+\' oldboy.txt -o am oldboy teacher teach linux like badminton ball billiard ball and chinese chess my blog is http oldboy blog cto com our site is http www etiantian org my qq num is not my god i am not oldbey but 小结: 1.可以把连续的东西通过正则取出来 2.一般与[]配合 #2]. | 或者 [root@oldboyedu01-nb oldboy]# egrep \'oldboy|linux\' oldboy.txt I am oldboy teacher! I teach linux. my blog is http://oldboy.blog.51cto.com Linux正则表达式之问题3:[] 与 | 区别 都可以表示或者 [abc] a|b|c 区别: 1.[]基础正则 |扩展正则 2.[]表示的是单个字符或者 |单个字符的或多个字符的都可 [a-z] oldboy|linux #3]. () 括号中的内容相当于是一个整体 后向引用(反向引用) [root@oldboyedu01-nb oldboy]# egrep \'oldb(o|e)y\' oldboy.txt I am oldboy teacher! my blog is http://oldboy.blog.51cto.com my god ,i am not oldbey,but OLDBOY! 先乘除再加减,有括号的先算括号里面的。 #后向引用,反向引用,一般是在sed命令中使用 sed,把你想要的内容先保护起来(通过小括号),然后再使用他。
    实例:需求,我要把123456用<>包起来 [root@oldboyedu01
-nb oldboy]# echo \'<123456>\' 当然不是这种玩赖的做法 <123456> [root@oldboyedu01-nb oldboy]# echo 123456|sed \'s#(.*)#\\1#g\' 注意:\\1 表示第一个小括号 sed: -e expression #1, char 11: invalid reference \\1 on `s\' command\'s RHS [root@oldboyedu01-nb oldboy]# echo 123456|sed -r \'s#(.*)#\\1#g\' 123456 [root@oldboyedu01-nb oldboy]# echo 123456|sed -r \'s#(.*)#<\\1#g\' <123456 [root@oldboyedu01-nb oldboy]# echo 123456|sed -r \'s#(.*)#<\\1>#g\' <123456> [root@oldboyedu01-nb oldboy]# echo 123456|sed -r \'s#.(.)..(.).#\\1#g\' 2 [root@oldboyedu01-nb oldboy]# echo 123456|sed -r \'s#.(.)..(.).#\\2#g\' 5 [root@oldboyedu01-nb oldboy]# echo 123456|sed -r \'s#.(.).(.)(.).#\\3#g\' 5
#4]. o{n,m} 前一个字符连续出现了至少n次,最多m次。 o{n} 前一个字符连续出现了n次 o{n,} 前一个字符连续出现了至少n次 o{,m} 前一个字符连续出现了最多m次 [root@oldboyedu01-nb oldboy]# egrep \'0{1,4}\' oldboy.txt my qq num is 49000448. not 4900000448. [root@oldboyedu01-nb oldboy]# egrep -o \'0{1,4}\' oldboy.txt 000 0000 0 [root@oldboyedu01-nb oldboy]# egrep \'0{3,4}\' oldboy.txt my qq num is 49000448. not 4900000448. [root@oldboyedu01-nb oldboy]# egrep \'0{3,4}\' oldboy.txt -o 000 0000 [root@oldboyedu01-nb oldboy]# egrep \'0{3,}\' oldboy.txt my qq num is 49000448. not 4900000448. [root@oldboyedu01-nb oldboy]# egrep \'0{3,}\' oldboy.txt -o 000 00000 [root@oldboyedu01-nb oldboy]# egrep \'0{3}\' oldboy.txt my qq num is 49000448. not 4900000448. [root@oldboyedu01-nb oldboy]# egrep \'0{3}\' oldboy.txt -o 000 000 [root@oldboyedu01-nb oldboy]# egrep \'[0-9]\' oldboy.txt my blog is http://oldboy.blog.51cto.com my qq num is 49000448. not 4900000448. [root@oldboyedu01-nb oldboy]# egrep \'[0-9]{8,}\' oldboy.txt my qq num is 49000448. not 4900000448. [root@oldboyedu01-nb oldboy]# egrep \'[0-9]{8,}\' oldboy.txt -o 49000448 4900000448 #5]. ? 表示前一个字符连续出现0次或1次 gd good god gooood [root@oldboyedu01-nb oldboy]# egrep \'gd|god\' li.log gd god [root@oldboyedu01-nb oldboy]# egrep \'go?d\' li.log gd god [root@oldboyedu01-nb oldboy]# egrep \'go*d\' li.log gd good god gooood

 

正则总结

# 1、正则符号
     连续出现(重复)
            *        >=0    0次或者多次
            +        >=1   1次以上
            ?        0 1     0次或者1次
            {n,m}    >=n  <=m   至少n次,最多m次
            {n}      ==n     取n次
     其他
            .        任意一个字符
            [abc]    一个整体 相当于是一个字符a或者b或者c
                     [a-z] [0-9] [A-Z]
            [^abc]   排除
            |        或者
            ()       后向引用  反向引用  先保护再使用
            ^        以什么什么开头
            $     以什么什么结尾
            .*       所有
            ^$       空行

#2、基础正则与扩展正则区别:
      支持基础正则            基础+扩展
         grep            egrep === grep -E
         sed                  sed -r
         awk                  awk
    使用撬棍\\ 也可以命令支持扩展正则(一般不用,遇到稍微复杂的会很麻烦)
    [root@luffy-01 oldboy]# grep \'god\\|gd\' alex.txt 
     gd
     god

#3、查询帮助:
    man grep(简单的帮助)
    查看详细的帮助信息info grep

 

练习题

过滤文本(awk、sed)

1、请执行命令取出linux中eth0的IP地址(请用cut,有能力者也可分别用awk,sed命令答)

思路
1.定位-取出第2行
2.取出你要的ip地址

方法1-awk方法+awk+awk
[root@oldboyedu01-nb ~]# ifconfig eth0|awk \'NR==2\'
          inet addr:10.0.0.200  Bcast:10.0.0.255  Mask:255.255.255.0
[root@oldboyedu01-nb ~]# ifconfig eth0|awk \'NR==2\'|awk \'{print $2}\'
addr:10.0.0.200
[root@oldboyedu01-nb ~]# ifconfig eth0|awk \'NR==2\'|awk \'{print $2}\'|awk -F":" \'{print $2}\'
10.0.0.200

方法2-awk+awk 
[root@oldboyedu01-nb ~]# ifconfig eth0|awk \'NR==2\'
          inet addr:10.0.0.200  Bcast:10.0.0.255  Mask:255.255.255.0
[root@oldboyedu01-nb ~]# ifconfig eth0|awk \'NR==2\'|awk -F "[: ]" \'{print $4}\'

[root@oldboyedu01-nb ~]# ifconfig eth0|awk \'NR==2\'|awk -F "[: ]" \'{print $11}\'
inet
[root@oldboyedu01-nb ~]# ifconfig eth0|awk \'NR==2\'|awk -F "[: ]" \'{print $13}\'
10.0.0.200
#遇到空格便切,前面有10个空格,切了10刀才遇到第一个非空格,太费劲了
#下面使用不费劲的方法,用+匹配(一个或者多个) [root@oldboyedu01-nb ~]# ifconfig eth0|awk \'NR==2\' inet addr:10.0.0.200 Bcast:10.0.0.255 Mask:255.255.255.0 [root@oldboyedu01-nb ~]# ifconfig eth0|awk \'NR==2\'|awk -F "[: ]+" \'{print $4}\' 10.0.0.200 ##理解连续出现 理解 [] + [root@oldboyedu01-nb ~]# echo \'######1@@@@@@@@2\' ######1@@@@@@@@2 [root@oldboyedu01-nb ~]# echo \'######1@@@@@@@@2\' |egrep \'[@#]\' ######1@@@@@@@@2 [root@oldboyedu01-nb ~]# echo \'######1@@@@@@@@2\' |egrep \'[@#]\' -o # # # # # # @ @ @ @ @ @ @ @ [root@oldboyedu01-nb ~]# [root@oldboyedu01-nb ~]# echo \'######1@@@@@@@@2\' |egrep \'[@#]+\' ######1@@@@@@@@2 [root@oldboyedu01-nb ~]# echo \'######1@@@@@@@@2\' |egrep \'[@#]+\' -o ###### @@@@@@@@ [root@oldboyedu01-nb ~]# echo \'######1@@@@@@@@2\' |awk -F "[@#]+" \'{print $2}\' 1 [root@oldboyedu01-nb ~]# echo \'######1@@@@@@@@2\' |awk -F "[@#]+" \'{print $3}\' 2 方法3-awk #预备姿势-通过awk取出 ifconfig eth0 结果中的 第二行的第二列 [root@oldboyedu01-nb ~]# ifconfig eth0|awk \'NR==2\' inet addr:10.0.0.200 Bcast:10.0.0.255 Mask:255.255.255.0 [root@oldboyedu01-nb ~]# ifconfig eth0|awk \'NR==2\'|awk \'{print $2}\' addr:10.0.0.200 [root@oldboyedu01-nb ~]# ifconfig eth0|awk \'NR==2{print $2}\' addr:10.0.0.200 [root@oldboyedu01-nb ~]# #awk \'找谁{干啥}\' #最终结果 [root@oldboyedu01-nb ~]# ifconfig eth0|awk -F "[: ]+" \'NR==2{print $4}\' 10.0.0.200 方法4-sed+sed+sed [root@oldboyedu01-nb ~]# ifconfig eth0|sed -n \'2p\' inet addr:10.0.0.200 Bcast:10.0.0.255 Mask:255.255.255.0 [root@oldboyedu01-nb ~]# ifconfig eth0|sed -n \'2p\'|sed \'s#^.*:##g\' 255.255.255.0 [root@oldboyedu01-nb ~]# ifconfig eth0|sed -n \'2p\'|sed \'s#^.*dr:##g\' 10.0.0.200 Bcast:10.0.0.255 Mask:255.255.255.0 [root@oldboyedu01-nb ~]# ifconfig eth0|sed -n \'2p\'|sed \'s#^.*dr:##g\'|sed \'s# Bc.*$##g\' 10.0.0.200 方法5-sed命令的后向引用 ****** #原则-先把你想要的内容保护起来,然后在后面使用 [root@oldboyedu01-nb ~]# ifconfig eth0|sed -n \'2p\' inet addr:10.0.0.200 Bcast:10.0.0.255 Mask:255.255.255.0 [root@oldboyedu01-nb ~]# ifconfig eth0|sed -n \'2p\'|sed -r \'s#^.*dr:##g\' 10.0.0.200 Bcast:10.0.0.255 Mask:255.255.255.0 [root@oldboyedu01-nb ~]# ifconfig eth0|sed -n \'2p\'|sed -r \'s#^.*dr:(.*) Bc.*$#\\1#g\' 10.0.0.200 方法6-sed #预备姿势-ifconfig eth0第二行的inet替换为oldboy [root@oldboyedu01-nb ~]# ifconfig eth0|sed -n \'2p\' inet addr:10.0.0.200 Bcast:10.0.0.255 Mask:255.255.255.0 [root@oldboyedu01-nb ~]# ifconfig eth0|sed -n \'2p\'|sed \'s#inet#oldboy#g\' oldboy addr:10.0.0.200 Bcast:10.0.0.255 Mask:255.255.255.0 [root@oldboyedu01-nb ~]# ifconfig eth0|sed -n \'2s#inet#oldboy#gp\' oldboy addr:10.0.0.200 Bcast:10.0.0.255 Mask:255.255.255.0 #最终结果- [root@oldboyedu01-nb ~]# ifconfig eth0|sed -nr \'2s#^.*dr:(.*) Bc.*$#\\1#gp\' 10.0.0.200 小结: 1.理解第2 3 5方法 2.了解6 3.awk指定多个连续的分隔符,sed的反向引用

 

2、如何取得/etc/hosts文件的权限对应的数字内容,如-rw-r--r-- 为644,要求使用命令取得644或0644这样的数字。

#方法1-awk
[root@oldboyedu01-nb ~]# stat /etc/hosts |awk \'NR==4\'
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
[root@oldboyedu01-nb ~]# stat /etc/hosts |awk -F "[(/]" \'NR==4{print $2}\'
0644


#方法2-sed
[root@oldboyedu01-nb ~]# stat /etc/hosts |sed -n \'4p\'
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
[root@oldboyedu01-nb ~]# stat /etc/hosts |sed -nr \'4s#^.*\\(##gp\'
    0/    root)
[root@oldboyedu01-nb ~]# stat /etc/hosts |sed -nr \'4s#^.*\\([0-9]+##gp\'
/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
[root@oldboyedu01-nb ~]# stat /etc/hosts |sed -nr \'4s#^.*\\(([0-9]+).*$#\\1#gp\'
0644

#方法3-stat命令的参数
[root@oldboyedu01-nb ~]# stat -c%a /etc/hosts
644

小结:
1.sed 反向引用  awk方法指定分隔符

 

3、已知/oldboy/test.txt 文件内容为:

oldboy

 

youxiaodao

 

pizza

请问如何把文件中的空行过滤掉(要求命令行实现)

#方法1-grep   -v表示排除
[root@oldboyedu01-nb oldboy]# grep \'^$\' test.txt


[root@oldboyedu01-nb oldboy]# grep -n \'^$\' test.txt
2:
4:
[root@oldboyedu01-nb oldboy]# grep -v \'^$\' test.txt
oldboy
xizi
xiaochao


#方法2-awk
[root@oldboyedu01-nb oldboy]# awk \'/^$/\' test.txt
[root@oldboyedu01-nb oldboy]# awk \'不要/^$/\' test.txt
awk: 不要/^$/
awk: ^ invalid char \'⥠in expression
! 表示排除
[root@oldboyedu01-nb oldboy]# awk \'!/^$/\' test.txt
oldboy
xizi
xiaochao
[root@oldboyedu01-nb oldboy]## awk \'不要/空行/\' test.txt


#方法3-sed-删除
[root@oldboyedu01-nb oldboy]# sed  \'/^$/d\'  test.txt
oldboy
xizi
xiaochao

小结:
1.通awk sed表示排除
2.awk !
3.sed d

 

 

4、已知/oldboy/ett.txt 文件内容为:

oldboy

pizzzzza

test

请使用grep或者egrep 正则匹配的方式过滤出前两行内容

#如何通过-sed awk 实现过滤 === grep/egrep
[root@oldboyedu01-nb oldboy]# cat ett.txt
oldboy
olldboooy
test
[root@oldboyedu01-nb oldboy]# egrep \'oldboy\' ett.txt
oldboy
[root@oldboyedu01-nb oldboy]# awk \'/oldboy/\' ett.txt
oldboy
[root@oldboyedu01-nb oldboy]# sed -n \'/oldboy/p\' ett.txt
oldboy
题目答案:
[root@oldboyedu01-nb oldboy]# egrep \'ol+dbo+y\' ett.txt
oldboy
olldboooy
[root@oldboyedu01-nb oldboy]# awk \'/ol+dbo+y/\' ett.txt
oldboy
olldboooy
[root@oldboyedu01-nb oldboy]# sed -n \'/ol+dbo+y/p\' ett.txt
[root@oldboyedu01-nb oldboy]# sed -nr \'/ol+dbo+y/p\' ett.txt
oldboy
olldboooy
[root@oldboyedu01-nb oldb

小结:
1.sed awk如何实现过滤类似grep/egrep
2.awk定位的方法
awk \'NR==1\'
awk \'NR==1,NR==10\'
awk \'//\'

3.sed定位
sed -n \'1p\'
sed -n \'1,10p\'
sed -n \'10,$p\'
sed -n \'//p\'

 

文件

5、linux下通过mkdir命令创建一个新目录/alexdir,alexdir的硬链接数是多少,为什么?
     然后在alexdir下面又创建了一个目录 /alexdir/test,问alexdir的硬链接数量是多少?

[root@luffy-01 oldboy]# mkdir /alexdir
[root@luffy-01 oldboy]# ll /|grep alex
drwxr-xr-x    2 root root  4096 Jan 15 15:21 alexdir
[root@luffy-01 oldboy]# mkdir /alexdir/test
[root@luffy-01 oldboy]# ll /|grep alex
drwxr-xr-x    3 root root  4096 Jan 15 15:21 alexdir

 

查看一下:

[root@luffy-01 oldboy]# ls -lid /alexdir/ /alexdir/.
143565 drwxr-xr-x 3 root root 4096 Jan 15 15:21 /alexdir/
143565 drwxr-xr-x 3 root root 4096 Jan 15 15:21 /alexdir/.

 

2个文件的inode是一样的。在当我们使用 cd . 的时候,也是进入了这个文件夹

创建之后,查看,果然是3个一样的inode

[root@luffy-01 oldboy]# ls -lid /alexdir/ /alexdir/. /alexdir/test/..
143565 drwxr-xr-x 3 root root 4096 Jan 15 15:21 /alexdir/
143565 drwxr-xr-x 3 root root 4096 Jan 15 15:21 /alexdir/.
143565 drwxr-xr-x 3 root root 4096 Jan 15 15:21 /alexdir/test/..

 

 

6、请给出默认情况eth0网卡配置文件的路径及客户端DNS的路径。

 /etc/sysconfig/network-scripts/ifcfg-eth0
 /配置/系统配置/网络-脚本/if(c f g)-eth0

 

 DNS的配置
 1./etc/resolv.conf
 2.网卡配置文件
 3.网卡配置文件里面的DNS优先

 

替换

7、查找当前目录下所有文件,并把文件中的www.etiantian.org字符串替换成www.oldboyedu.com

假设现在在/oldboy
 find /oldboy -type f -name "*.txt"

 #方法1
 find /oldboy -type f -name "*.txt"|xargs sed \'s#www.etiantian.org#www.oldboyedu.com#g\'
  (管道|什么时候用xargs,什么时候不用呢?)
 #方法2
 ##预备姿势
 [root@oldboyedu01-nb ~]# #ls -l 此处存放着 which mkdir命令的结果
 [root@oldboyedu01-nb ~]# #ls -l  which mkdir
 [root@oldboyedu01-nb ~]# #ls -l $(which mkdir)
 [root@oldboyedu01-nb ~]# #ls -l `which mkdir`
 [root@oldboyedu01-nb ~]# ls -l `which mkdir`
 -rwxr-xr-x. 1 root root 50056 Mar 23  2017 /bin/mkdir
 [root@oldboyedu01-nb ~]# ls -l $(which mkdir)
 -rwxr-xr-x. 1 root root 50056 Mar 23  2017 /bin/mkdir
 ##最终结果
 sed \'s#www.etiantian.org#www.oldboyedu.com#g\'  此处存放着find命令的结果
 sed \'s#www.etiantian.org#www.oldboyedu.com#g\'  $(find /oldboy -type f -name "*.txt")

 #方法3
 find /oldboy -type f -name "*.txt"  -exec ls -l  {}  \\;
  -exec 是 find的参数,{}接受前面find命令的结果

 

一个故障实例(被植入js)

7.1有一个实际是这样的,情况是:一个lamp的服务器,站点目录下的所有文件军备植入了js代码,导致网站打开时就会调用这个地址,显示广告,造成很恶劣的影响,

 

解决方案:
#1、运营、网站用户发现

以上是关于Linux之特殊符号与正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

shell编程之正则表达式与文本处理器

shell编程之正则表达式与文本处理器

JS正则表达式之特殊符号

正则表达式特殊符号及用法

Linux正则表达式详解

linux内特殊符号通配符正则表达式