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

吃可爱长大的小学妹 提交于 2020-03-04 12:21:34

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、运营、网站用户发现弹窗广告
#2、运营报告给开发,开发联系运维,共同解决
#3、开发发现的问题就是,站点的目录都被植入了js代码
#4、运维人员解决问题:
##   1)运维备份原始出问题的原始文件
##   2)历史备份覆盖
##   3)find+sed覆盖
#5、仔细查看日志,寻找问题发现根源
#6、提供盲羊补牢解决方案(站点目录严格权限规划方案,以及新上线发布规范思路)

 

echo的参数使用

8、请问在一个命令上加什么参数可以实现下面命令的内容在同一行输出。
       echo "oldboy";echo "oldboy"

# ;  ====>分号表示分隔多条命令
ls;pwd;hello

[root@oldboyedu01-nb ~]# echo -n "oldboy";echo "oldboy"
oldboyoldboy
# -n 表示取消输出每一行结尾的换行符号

[root@oldboyedu01-nb ~]# echo -e "a\nb"
a
b
# echo命令的-e参数,就是让echo支持\n \t 
[root@oldboyedu01-nb ~]# echo -e "a\nb\n\tc" >echo.txt
[root@oldboyedu01-nb ~]# cat echo.txt
a
b
    c
# -A显示文件中的特殊符号
[root@oldboyedu01-nb ~]# cat -A echo.txt
a$
b$
^Ic$

 

时间命令

9、请给出如下格式的date命令,例:11-02-26。再给出实现按周输出 比如:周六输出为6,请分别给出命令。

date命令的使用

[root@oldboyedu01-nb ~]# date
Fri Oct 20 05:20:30 CST 2017
[root@oldboyedu01-nb ~]# #2017-11-11
[root@oldboyedu01-nb ~]# #date +格式
[root@oldboyedu01-nb ~]# date +%F
2017-10-20
[root@oldboyedu01-nb ~]# date +%Y-%m-%d
2017-10-20
[root@oldboyedu01-nb ~]# date +%w
5
[root@oldboyedu01-nb ~]# #显示当前的日期以年-月-日_周几

[root@oldboyedu01-nb ~]# date +%F_%w
2017-10-20_5

[root@oldboyedu01-nb ~]# date +%F_%w
2017-10-20_5
[root@oldboyedu01-nb ~]# date +%T
05:25:33
[root@oldboyedu01-nb ~]# date +%H:%M:%S
05:25:51

date命令按照格式显示日期小结:
1.date +格式
2.%F ===> %Y-%m-%d 年-月-日
  %T ===> %H:%M:%S 时:分:秒
  %w ===> 周几

 

 

10、扩展问题:打印三天前的日期,格式如:2088-08-28

如何显示指定日期:使用-d参数

[root@oldboyedu01-nb ~]# date
Fri Oct 20 05:28:44 CST 2017
[root@oldboyedu01-nb ~]# date -d "1day"  显示1天后的日期
Sat Oct 21 05:29:07 CST 2017
[root@oldboyedu01-nb ~]# date -d "+1day" 显示一天后
Sat Oct 21 05:29:18 CST 2017
[root@oldboyedu01-nb ~]# date -d "-1day" 显示前一天
Thu Oct 19 05:29:42 CST 2017

[root@oldboyedu01-nb ~]# date -d "-1day" +%F   也可以制定显示格式
2017-10-19
[root@oldboyedu01-nb ~]# date -d "1day" +%F    
2017-10-21
[root@oldboyedu01-nb ~]# #year month day hour min sec  格式顺序

#显示7天前的时间按照格式年-月-日_周几
[root@oldboyedu01-nb ~]#
[root@oldboyedu01-nb ~]# date +%F_%w
2017-10-20_5
[root@oldboyedu01-nb ~]# date +%F_%w -d "-7day"
2017-10-13_5

 

 

修改系统日期:使用-s参数

[root@oldboyedu01-nb ~]# date -s "21111111 11:11:11"  
Wed Nov 11 11:11:11 CST 2111
[root@oldboyedu01-nb ~]# date -s "1hour"  把当前系统时间往后添加一个小时
Wed Nov 11 12:12:51 CST 2111
[root@oldboyedu01-nb ~]# date -s "-1hour"
Wed Nov 11 11:12:56 CST 2111

 

 

利用时间服务器,自动修改系统时间

时间服务器
pool.ntp.org
ntp1.aliyun.com

[root@luffy-01 oldboy]# ntpdate pool.ntp.org

 

PATH环境变量

11、【Centos 5.x】当从root用户切到普通用户pizza时,执行ifconfig会提示。command not found.

1、Linux运行命令过程
输入命令
linux会在PATH里面进行查找
运行
报错

2、PATH环境变量


修改PATH环境变量
##临时
[root@oldboyedu01-nb ~]# export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@oldboyedu01-nb ~]#[root@oldboyedu01-nb ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

##永久
把环境变量的配置命令追加到/etc/profile中
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

##生效
source /etc/profile


小结:
1.什么是PATH环境变量
2.如何修改PATH环境变量

 

文件

12、请描述下列路径的内容是做什么的?

/var/log/messages          系统默认的日志
/var/log/secure            用户的登录信息
/etc/fstab                 开机的时候自动挂载列表  在开机的时候每个磁盘分区对应着什么入口的列表
/etc/profile               配置环境变量  别名
/var/spool/cron/root       定时任务的配置文件
/etc/hosts                 解析主机名
                          /etc/hosts                 主机名---->ip地址
                          DNS解析                     域名--->   ip过程

 



13、如何快速查到ifconfig的全路径,请给出命令。

####方法1 which (在PATH环境变量)
[root@oldboyedu01-nb ~]# which mkdir
/bin/mkdir
[root@oldboyedu01-nb ~]# which sed
/bin/sed

####方法2 find
[root@oldboyedu01-nb ~]# find / -type f -name "gawk"
/bin/gawk
[root@oldboyedu01-nb ~]# find / -type f -name "sed"
/bin/sed
[root@oldboyedu01-nb ~]# find / -type f -name "mkdir"
/bin/mkdir

####方法3  whereis 找出命令相关的 帮助 man  ,所以会很多
[root@oldboyedu01-nb ~]# whereis sed
sed: /bin/sed /usr/share/man/man1p/sed.1p.gz /usr/share/man/man1/sed.1.gz
[root@oldboyedu01-nb ~]# whereis awk
awk: /bin/awk /usr/bin/awk /usr/libexec/awk /usr/share/awk /usr/share/man/man1p/awk.1p.gz /usr/share/man/man1/awk.1.gz
[root@luffy-01 ~]# whereis -b sed   使用-b参数,得到的只是二进制文件sed: /bin/sed
####方法4  locate    根据名字 找出文件的路径
                     根据文件名字与文件路径表格(数据库) 查找,一般不使用,因为使用它会去查询数据库,导致磁盘空间紧张
                     updatedb  跟新数据库
[root@oldboyedu01-nb ~]# touch oldboy-20171111.log
[root@oldboyedu01-nb ~]# locate 20171111   刚刚建立的文件没有,跟新一下,才能查找到
[root@oldboyedu01-nb ~]# updatedb
[root@oldboyedu01-nb ~]# locate 20171111
/root/oldboy-20171111.log

 

 

查询Linux在线用户

14、请给出查看当前哪些用户在线的linux命令。

用户在线是什么意思呢 =====> 远程连接到服务器的用户

远程登录的用户=====通过xshell或SecureCRT连接服务器

方式一:w

[root@luffy-01 ~]# w   
 17:40:11 up  8:58(累计已开机时间),  2 users,  load average(平均负载): 0.00, 0.00, 0.00   load average(平均负载)
USER           TTY      FROM              LOGIN@              IDLE   JCPU   PCPU WHAT
pizza          tty1     -(代表本地)     08:44               08:53  0.09s  0.09s -bash  
root           pts/0    10.0.0.1         11:31               0.00s  0.02s  0.00s w
root           pts/1    10.0.0.1         11:55               3:35   0.00s  0.00s -bash
root           pts/2    10.0.0.1         11:55              12.00s  0.01s  0.01s -bash
远程登录的用户          从哪里登录的     什么时候连接入系统                      这个用户在做什么

 

 系统的负载---系统繁忙程度
 如果负载接近-服务cpu的核心总数

[root@luffy-01 ~]# cat /proc/cpuinfo  查看CPU信息
processor    : 0
vendor_id    : AuthenticAMD
cpu family    : 21
model        : 16
model name    : AMD Athlon(tm) X4 730 Quad Core Processor      
stepping    : 1
cpu MHz        : 2800.099
cache size    : 2048 KB
physical id    : 0
siblings    : 1
core id        : 0
cpu cores    : 1
apicid        : 0
initial apicid    : 0
fpu        : yes
fpu_exception    : yes
cpuid level    : 13
wp        : yes
flags        : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc up rep_good tsc_reliable nonstop_tsc aperfmperf unfair_spinlock pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic popcnt aes xsave avx f16c hypervisor lahf_lm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw xop fma4 tbm bmi1
bogomips    : 5600.19
TLB size    : 1536 4K pages
clflush size    : 64
cache_alignment    : 64
address sizes    : 42 bits physical, 48 bits virtual
power management:

 

 

[root@luffy-01 ~]# lscpu  查看cpu信息
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                1
On-line CPU(s) list:   0
Thread(s) per core:    1
Core(s) per socket:    1
Socket(s):             1
NUMA node(s):          1
Vendor ID:             AuthenticAMD
CPU family:            21
Model:                 16
Model name:            AMD Athlon(tm) X4 730 Quad Core Processor
Stepping:              1
CPU MHz:               2800.099
BogoMIPS:              5600.19
Hypervisor vendor:     VMware
Virtualization type:   full
L1d cache:             16K
L1i cache:             64K
L2 cache:              2048K
NUMA node0 CPU(s):     0

 

 

方式二:last

[root@luffy-01 ~]# last  谁在什么时间登陆了系统,连接了多久
root     pts/0        10.0.0.1         Tue Jan 15 08:47   still logged in   
pizza    tty1                          Tue Jan 15 08:44   still logged in 

 

 

方式三:lastlog

显示系统中所有用户的最近一次的登录信息

 

15、如何正确关机和重启

重启:

init 6     将启动级别改为重启

reboot  立刻重启

shutdown -r 1   一分钟后重启系统

shutdown -c     把正在关机或者重启的命令取消掉,一台远程登录重启,另一台可以在时间内停止这条命令

shutdown -r now  =====>相当于reboot

 

关机:

init 0

poweroff  会断电(物理机)

halt     需要手动关闭电源(物理机)

shutdown -h 1

shutdown -h now   ======>相当于poweroff

 

16、写出Linux命令行快捷键的功能

Ctrl + a   把光标移动到《行首》
Ctrl + e   把光标移动到《行尾》

Ctrl + c   取消当前的操作 cancel
Ctrl + d   logout命令(当前行没有任何内容,退出当前用户)
Ctrl + l  (小写字母L) 清除屏幕内容 clear

Ctrl + u   剪切光标所在位置到行首的内容
Ctrl + k   剪切光标所在位置到行尾的内容
ctrl + y   粘贴

ctrl + →   把光标向右移动一个单词
ctrl + ←   把光标向左移动一个单词


history |grep awk

Ctrl + r search 搜索历史命令,没有找到,继续按快捷键,继续搜索,找到了按enter

 

17、vi/vim快捷键初级

陈皓(左耳朵耗子)的VIM攻略

移动光标:

    ↑k
←h      →l
    ↓j

两边左右hl  中间是上下


移动到文件的第一行           gg   :1  1G
移动到文件的最后一行         G    :$
快速到达文件的第100行       100gg  100G  :100
移动光标到行首              0    ^
移动光标到行尾              $


编辑:
在当前行下一行插入一个空行并进入到编辑模式       o(小写字母O)
剪切光标所在位置到行尾的内容,然后进入编辑模式   C(大写字母C)
删除当前行的内容到行尾                          dG
撤销上一次的操作                                 u
恢复上一次的操作                            ctrl+r


复制粘贴剪切:

删除光标所在位置的内容到行尾 D

复制当前行                                      yy
剪切(删除)当前行                                dd
粘贴                                            p


搜索:
/你要找的内容    继续向下搜索n     继续向上搜索N


vim查询帮助

:h  :wq
:h  G

 

练习题总结

    正则表达式练习题
        取出网卡ip地址
        取出权限
    grep,sed,awk进行过滤
    find命令与其他命令配置rm ls -l sed
        三种方法
    date显示或设置系统日期
        按照你的说明显示指定的日期
        以指定格式显示日期
        自动修改系统时间
    Linux下面快捷键
    vi/vim快捷键

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!