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

[[email protected]-nb oldboy]# find /oldboy/ -type f -name "oldboy"
/oldboy/oldboy
[[email protected]-nb oldboy]# find /oldboy/ -type f -name "*oldboy"
/oldboy/oldboy
/oldboy/eduoldboy
[[email protected]-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.  {} 生成序列
[[email protected] oldboy]# echo {1..6}
1 2 3 4 5 6
[[email protected]-nb oldboy]# echo {1..10}
1 2 3 4 5 6 7 8 9 10

[[email protected]-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
[[email protected]-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
[[email protected]-nb oldboy]# echo {01..10}
01 02 03 04 05 06 07 08 09 10
[[email protected]-nb oldboy]# echo stu{01..10}
stu01 stu02 stu03 stu04 stu05 stu06 stu07 stu08 stu09 stu10
[[email protected]-nb oldboy]# echo 20{01..10}
2001 2002 2003 2004 2005 2006 2007 2008 2009 2010
[[email protected]-nb oldboy]#
[[email protected] oldboy]# echo {1,9,20}
1 9 20

#通过{}进行备份
[[email protected] oldboy]# echo A{B,C}
AB AC
[[email protected]-nb oldboy]# echo A{,C}
A AC
[[email protected]-nb oldboy]# echo oldboy.txt{,.bak}
oldboy.txt oldboy.txt.bak
[[email protected]-nb oldboy]# touch oldboy.txt
[[email protected] oldboy]# cp oldboy.txt{,.bak}
[[email protected] 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
[[email protected]-nb oldboy]# cp oldboy.txt{,.bak}
[[email protected] oldboy]# #cp oldboy.txt{,.bak}
[[email protected] oldboy]# echo oldboy.txt{,.bak}
oldboy.txt oldboy.txt.bak
[[email protected]-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].  ^  以....开头的行
[[email protected] 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].  $  以....结尾的行
[[email protected] oldboy]# grep ‘m$‘ oldboy.txt
my blog is http://oldboy.blog.51cto.com

#3].  ^$ 空行 这一行中没有任何的符号
[[email protected] oldboy]# grep -n ‘^$‘ oldboy.txt
3:
8:

排除文件中的空行
[[email protected]-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的执行过程 正则每次匹配到了什么?

    找出文件中以点结尾的行
[[email protected]-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].  \(撬棍)  转义符号  脱掉马甲,打回原形
[[email protected] oldboy]# grep ‘\.$‘ oldboy.txt
I teach linux.
my qq num is 49000448.
  # \n     表示回车换行

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

[[email protected]-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!
[[email protected]-nb oldboy]#
[[email protected] 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结尾的行
[[email protected]-nb oldboy]# grep ‘^m.*m$‘ oldboy.txt
my blog is http://oldboy.blog.51cto.com

#8].  []  中括号 [abc]  相当于是一个字符 找出包含a或b或c的行

[[email protected]-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!
[[email protected]-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 结尾的行
[[email protected]-nb oldboy]# grep ‘^[mno].*[mg]$‘ oldboy.txt
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org

[[email protected]-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的内容
[[email protected] 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次或多次  ,贪婪匹配,尽可能多的匹配
[[email protected] oldboy]# egrep  ‘0‘ oldboy.txt
my qq num is 49000448.
not 4900000448.
[[email protected]-nb oldboy]# egrep  ‘0+‘ oldboy.txt
my qq num is 49000448.
not 4900000448.
[[email protected]-nb oldboy]# egrep  ‘0+‘ oldboy.txt -o
000
00000
[[email protected]-nb oldboy]# egrep  ‘0‘ oldboy.txt -o
0
0
0
0
0
0
0
0符号 + 的应用
    #把文件中连续出现的小写字母取出来
    #1.取出小写字母
[[email protected] 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.连续出现的小写字母
[[email protected] 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.只保留连续出现的小写字母
[[email protected] 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]. | 或者

[[email protected]-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]. ()  括号中的内容相当于是一个整体 后向引用(反向引用)
[[email protected] 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用<>包起来
[[email protected]-nb oldboy]# echo ‘<123456>‘ 当然不是这种玩赖的做法
<123456>
[[email protected]-nb oldboy]# echo 123456|sed ‘s#(.*)#\1#g‘      注意:\1 表示第一个小括号
sed: -e expression #1, char 11: invalid reference \1 on `s‘ command‘s RHS
[[email protected] oldboy]# echo 123456|sed -r ‘s#(.*)#\1#g‘
123456
[[email protected]-nb oldboy]# echo 123456|sed -r ‘s#(.*)#<\1#g‘
<123456
[[email protected]-nb oldboy]# echo 123456|sed -r ‘s#(.*)#<\1>#g‘
<123456>
[[email protected]-nb oldboy]# echo 123456|sed -r ‘s#.(.)..(.).#\1#g‘
2
[[email protected]-nb oldboy]# echo 123456|sed -r ‘s#.(.)..(.).#\2#g‘
5
[[email protected]-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次

[[email protected]-nb oldboy]# egrep ‘0{1,4}‘  oldboy.txt
my qq num is 49000448.
not 4900000448.
[[email protected]-nb oldboy]# egrep -o ‘0{1,4}‘  oldboy.txt
000
0000
0
[[email protected]-nb oldboy]# egrep  ‘0{3,4}‘  oldboy.txt
my qq num is 49000448.
not 4900000448.
[[email protected]-nb oldboy]# egrep  ‘0{3,4}‘  oldboy.txt -o
000
0000

[[email protected]-nb oldboy]# egrep  ‘0{3,}‘  oldboy.txt
my qq num is 49000448.
not 4900000448.
[[email protected]-nb oldboy]# egrep  ‘0{3,}‘  oldboy.txt -o
000
00000

[[email protected]-nb oldboy]# egrep  ‘0{3}‘  oldboy.txt
my qq num is 49000448.
not 4900000448.
[[email protected]-nb oldboy]# egrep  ‘0{3}‘  oldboy.txt -o
000
000

[[email protected]-nb oldboy]# egrep ‘[0-9]‘ oldboy.txt
my blog is http://oldboy.blog.51cto.com
my qq num is 49000448.
not 4900000448.
[[email protected]-nb oldboy]# egrep ‘[0-9]{8,}‘ oldboy.txt
my qq num is 49000448.
not 4900000448.
[[email protected]-nb oldboy]# egrep ‘[0-9]{8,}‘ oldboy.txt -o
49000448
4900000448

    #5]. ?  表示前一个字符连续出现0次或1次
gd
good
god
gooood

[[email protected]-nb oldboy]# egrep ‘gd|god‘ li.log
gd
god
[[email protected]-nb oldboy]# egrep ‘go?d‘ li.log
gd
god
[[email protected]-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
    使用撬棍\ 也可以命令支持扩展正则(一般不用,遇到稍微复杂的会很麻烦)
    [[email protected]-01 oldboy]# grep ‘god\|gd‘ alex.txt
     gd
     god

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

练习题

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

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

方法1-awk方法+awk+awk
[[email protected]-nb ~]# ifconfig eth0|awk ‘NR==2‘
          inet addr:10.0.0.200  Bcast:10.0.0.255  Mask:255.255.255.0
[[email protected]-nb ~]# ifconfig eth0|awk ‘NR==2‘|awk ‘{print $2}‘
addr:10.0.0.200
[[email protected]-nb ~]# ifconfig eth0|awk ‘NR==2‘|awk ‘{print $2}‘|awk -F":" ‘{print $2}‘
10.0.0.200

方法2-awk+awk
[[email protected]-nb ~]# ifconfig eth0|awk ‘NR==2‘
          inet addr:10.0.0.200  Bcast:10.0.0.255  Mask:255.255.255.0
[[email protected]-nb ~]# ifconfig eth0|awk ‘NR==2‘|awk -F "[: ]" ‘{print $4}‘

[[email protected]-nb ~]# ifconfig eth0|awk ‘NR==2‘|awk -F "[: ]" ‘{print $11}‘
inet
[[email protected]-nb ~]# ifconfig eth0|awk ‘NR==2‘|awk -F "[: ]" ‘{print $13}‘
10.0.0.200#遇到空格便切,前面有10个空格,切了10刀才遇到第一个非空格,太费劲了#下面使用不费劲的方法,用+匹配(一个或者多个)
[[email protected]-nb ~]# ifconfig eth0|awk ‘NR==2‘
          inet addr:10.0.0.200  Bcast:10.0.0.255  Mask:255.255.255.0
[[email protected]-nb ~]# ifconfig eth0|awk ‘NR==2‘|awk -F "[: ]+" ‘{print $4}‘
10.0.0.200

##理解连续出现  理解 [] +
[[email protected] ~]# echo ‘######[email protected]@@@@@@@2‘
######[email protected]@@@@@@@2
[[email protected] ~]# echo ‘######[email protected]@@@@@@@2‘ |egrep ‘[@#]‘
######[email protected]@@@@@@@2
[[email protected] ~]# echo ‘######[email protected]@@@@@@@2‘ |egrep ‘[@#]‘ -o
#
#
#
#
#
#
@
@
@
@
@
@
@
@
[[email protected]-nb ~]#
[[email protected] ~]# echo ‘######[email protected]@@@@@@@2‘ |egrep ‘[@#]+‘
######[email protected]@@@@@@@2
[[email protected] ~]# echo ‘######[email protected]@@@@@@@2‘ |egrep ‘[@#]+‘  -o
######
@@@@@@@@
[[email protected]-nb ~]# echo ‘######[email protected]@@@@@@@2‘ |awk -F "[@#]+" ‘{print $2}‘
1
[[email protected]-nb ~]# echo ‘######[email protected]@@@@@@@2‘ |awk -F "[@#]+" ‘{print $3}‘
2

方法3-awk

#预备姿势-通过awk取出 ifconfig eth0 结果中的 第二行的第二列
[[email protected] ~]# ifconfig eth0|awk ‘NR==2‘
          inet addr:10.0.0.200  Bcast:10.0.0.255  Mask:255.255.255.0
[[email protected]-nb ~]# ifconfig eth0|awk ‘NR==2‘|awk ‘{print $2}‘
addr:10.0.0.200

[[email protected]-nb ~]# ifconfig eth0|awk ‘NR==2{print $2}‘
addr:10.0.0.200
[[email protected]-nb ~]# #awk ‘找谁{干啥}‘

#最终结果
[[email protected] ~]# ifconfig eth0|awk -F "[: ]+"  ‘NR==2{print $4}‘
10.0.0.200

方法4-sed+sed+sed
[[email protected]-nb ~]# ifconfig eth0|sed -n ‘2p‘
          inet addr:10.0.0.200  Bcast:10.0.0.255  Mask:255.255.255.0
[[email protected]-nb ~]# ifconfig eth0|sed -n ‘2p‘|sed ‘s#^.*:##g‘
255.255.255.0
[[email protected]-nb ~]# ifconfig eth0|sed -n ‘2p‘|sed ‘s#^.*dr:##g‘
10.0.0.200  Bcast:10.0.0.255  Mask:255.255.255.0
[[email protected]-nb ~]# ifconfig eth0|sed -n ‘2p‘|sed ‘s#^.*dr:##g‘|sed ‘s#  Bc.*$##g‘
10.0.0.200

方法5-sed命令的后向引用 ******
#原则-先把你想要的内容保护起来,然后在后面使用
[[email protected] ~]# ifconfig eth0|sed -n ‘2p‘
          inet addr:10.0.0.200  Bcast:10.0.0.255  Mask:255.255.255.0
[[email protected]-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
[[email protected]-nb ~]# ifconfig eth0|sed -n ‘2p‘|sed -r ‘s#^.*dr:(.*)  Bc.*$#\1#g‘
10.0.0.200

方法6-sed
#预备姿势-ifconfig eth0第二行的inet替换为oldboy
[[email protected] ~]# ifconfig eth0|sed -n ‘2p‘
          inet addr:10.0.0.200  Bcast:10.0.0.255  Mask:255.255.255.0
[[email protected]-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
[[email protected]-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
#最终结果-
[[email protected] ~]# 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
[[email protected] ~]# stat /etc/hosts |awk ‘NR==4‘
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
[[email protected]-nb ~]# stat /etc/hosts |awk -F "[(/]" ‘NR==4{print $2}‘
0644

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

#方法3-stat命令的参数
[[email protected] ~]# stat -c%a /etc/hosts
644

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

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

oldboy

youxiaodao

pizza

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

#方法1-grep   -v表示排除
[[email protected] oldboy]# grep ‘^$‘ test.txt

[[email protected]-nb oldboy]# grep -n ‘^$‘ test.txt
2:
4:
[[email protected]-nb oldboy]# grep -v ‘^$‘ test.txt
oldboy
xizi
xiaochao

#方法2-awk
[[email protected] oldboy]# awk ‘/^$/‘ test.txt
[[email protected] oldboy]# awk ‘不要/^$/‘ test.txt
awk: 不要/^$/
awk: ^ invalid char ‘?in expression
! 表示排除
[[email protected] oldboy]# awk ‘!/^$/‘ test.txt
oldboy
xizi
xiaochao
[[email protected]-nb oldboy]## awk ‘不要/空行/‘ test.txt

#方法3-sed-删除
[[email protected] 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
[[email protected] oldboy]# cat ett.txt
oldboy
olldboooy
test
[[email protected]-nb oldboy]# egrep ‘oldboy‘ ett.txt
oldboy
[[email protected]-nb oldboy]# awk ‘/oldboy/‘ ett.txt
oldboy
[[email protected]-nb oldboy]# sed -n ‘/oldboy/p‘ ett.txt
oldboy
题目答案:
[[email protected]-nb oldboy]# egrep ‘ol+dbo+y‘ ett.txt
oldboy
olldboooy
[[email protected]-nb oldboy]# awk ‘/ol+dbo+y/‘ ett.txt
oldboy
olldboooy
[[email protected]-nb oldboy]# sed -n ‘/ol+dbo+y/p‘ ett.txt
[[email protected] oldboy]# sed -nr ‘/ol+dbo+y/p‘ ett.txt
oldboy
olldboooy
[[email protected]-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的硬链接数量是多少?

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

查看一下:

[[email protected] 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

[[email protected] 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
 ##预备姿势
 [[email protected] ~]# #ls -l 此处存放着 which mkdir命令的结果
 [[email protected] ~]# #ls -l  which mkdir
 [[email protected] ~]# #ls -l $(which mkdir)
 [[email protected] ~]# #ls -l `which mkdir`
 [[email protected] ~]# ls -l `which mkdir`
 -rwxr-xr-x. 1 root root 50056 Mar 23  2017 /bin/mkdir
 [[email protected]-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命令的结果

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

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

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

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

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

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

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

date命令的使用

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

[[email protected]-nb ~]# date +%F_%w
2017-10-20_5

[[email protected]-nb ~]# date +%F_%w
2017-10-20_5
[[email protected]-nb ~]# date +%T
05:25:33
[[email protected]-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参数

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

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

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

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

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

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

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

[[email protected]-01 oldboy]# ntpdate pool.ntp.org

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

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

2、PATH环境变量

修改PATH环境变量
##临时
[[email protected] ~]# export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[[email protected] ~]#[[email protected] ~]# 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环境变量)
[[email protected] ~]# which mkdir
/bin/mkdir
[[email protected]-nb ~]# which sed
/bin/sed

####方法2 find
[[email protected] ~]# find / -type f -name "gawk"
/bin/gawk
[[email protected]-nb ~]# find / -type f -name "sed"
/bin/sed
[[email protected]-nb ~]# find / -type f -name "mkdir"
/bin/mkdir

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

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

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

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

方式一:w

[[email protected] ~]# w
 17:40:11 up  8:58(累计已开机时间),  2 users,  load average(平均负载): 0.00, 0.00, 0.00   load average(平均负载)
USER           TTY      FROM              [email protected]              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的核心总数

[[email protected] ~]# 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:
[[email protected] ~]# 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

[[email protected] ~]# 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快捷键

原文地址:https://www.cnblogs.com/yxiaodao/p/10270036.html

时间: 2024-09-30 15:35:15

Linux之特殊符号与正则表达式的相关文章

Day15 - linux的特殊符号与正则表达式

第1章 linux的特殊符号 1.1 通配符 * {} 1.1.1 含义 方便查找文件 通配符是用来找文件名字的. 1.1.2  * 通过find 命令找以 .sh 结尾的文件,使用*替代文件名字. find /oldboy -type f -name "*.sh" -mtime +7 -size +100k -size -10M 查找文件名中,包含有oldboy字节的文件. [[email protected] 20170118]# find -type f -name "

Linux中grep、egrep正则表达式的使用

正则表达式的由来 正则表达式,英文写法Regular Expression,在编程语言中常被简写为regex.regexp等.它是用来描述.匹配一系列符合某个句法规则字符串的单个字符串. 正则表达式通常被用来检索.替换那些符合某个模式(Pattern)的文本. 1950年代,UNIX之父Ken Thompson将正则表达式引入编辑器QED,然后是编辑器ed,最终引入到grep中.从此,正则表达式被广泛地应用到了各种UNIX或类UNIX系统的工具之中,例如perl. 近些年来,主流操作系统.主流开

Linux系统的grep以及正则表达式浅析!

grep命令可以从文本中或者通过管道送过来的字符流中或一个"-"符号代替文件名来搜索精确或者模糊的匹配信息,grep家族有三个命令:grep,egrep,fgrep. grep支持正则表达式匹配查找 egrep支持扩展正则表达式匹配查找 fgrep不支持正则表达式匹配查找 grep命令的格式: grep [OPT] 'PATTERN' FILE PATTERN是所需要匹配的内容 精确匹配中单双引号的含义相同 如果PATTERN是精确匹配(即只有普通字符不包含元字符)且字符串中间不包含空

Linux 命令grep, egrep,正则表达式大全

Linux grep 命令     Linux系统中grep,egrep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户. 1.grep : 最早的文本匹配程序,使用POSIX定义的基本正则表达式(BRE)来匹配文本. 2.egrep : 扩展式grep,其使用扩展式正规表达式(ERE)来匹配文本. 3.fgrep : 快速grep,这个版

Linux中特殊符号的用法

在shell中常用的特殊符号罗列如下: # ;   ;; . , / \\ 'string'| !   $   ${}   $? $$   $* \"string\"* **   ? : ^ $#   [email protected] `command`{}   [] [[]] ()   (()) ||   && {xx,yy,zz,...}~   ~+   ~-   &   \\<...\\>   + - %=   ==   != #井号 (co

linux 中特殊符号用法详解

# 井号 (comments)#管理员  $普通用户 脚本中 #!/bin/bash   #!/bin/sh井号也常出现在一行的开头,或者位于完整指令之后,这类情况表示符号后面的是注解文字,不会被执行. # This line is comments.echo "a = $a" # a = 0由于这个特性,当临时不想执行某行指令时,只需在该行开头加上 # 就行了.这常用在撰写过程中.#echo "a = $a" # a = 0如果被用在指令中,或者引号双引号括住的话

(转)linux 中特殊符号用法详解

linux 中特殊符号用法详解 原文:https://www.cnblogs.com/lidabo/p/4323979.html # 井号 (comments)#管理员  $普通用户 脚本中 #!/bin/bash   #!/bin/sh井号也常出现在一行的开头,或者位于完整指令之后,这类情况表示符号后面的是注解文字,不会被执行. # This line is comments.echo "a = $a" # a = 0由于这个特性,当临时不想执行某行指令时,只需在该行开头加上 # 就

linux的特殊符号解释

转:https://www.cnblogs.com/balaamwe/archive/2012/03/15/2397998.html # 井号 (comments)这几乎是个满场都有的符号,除了先前已经提过的"第一行"#!/bin/bash井号也常出现在一行的开头,或者位于完整指令之后,这类情况表示符号后面的是注解文字,不会被执行.# This line is comments.echo "a = $a" # a = 0由于这个特性,当临时不想执行某行指令时,只需在

linux后台运行&符号、nohup命令、输出重定向等使用方法

列出若干种情形,便于这几个命令及参数的理解: 在命令最后加上&符号,表示让这个进程到后台去执行,这样立刻返回到提示符状态,我们可以接着做下面的事.如:command & 但此时如果这个进程有输出,还是会显示出来,这又会干扰到我们的shell窗口.所以可以考虑把标准输出重定向到某个文件去,如:command >output & 现在清净了.但有时我们会发现后台运行的进程出错了,我们希望把错误信息也保存起来.那就用到了linux中默认定义两个变量:1指标准输出:2指错误输出,所以