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

 

擴展正則

+  | () {} ?html

 

    #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

 

正則總結

# 一、正則符號
     連續出現(重複)
            *        >=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]   排除
            |        或者
            ()       後向引用  反向引用  先保護再使用
            ^        以什麼什麼開頭
            $     以什麼什麼結尾
            .*       全部
            ^$       空行

#二、基礎正則與擴展正則區別:
      支持基礎正則            基礎+擴展
         grep            egrep === grep -E
         sed                  sed -r
         awk                  awk
    使用撬棍\ 也能夠命令支持擴展正則(通常不用,遇到稍微複雜的會很麻煩)
    [root@luffy-01 oldboy]# grep 'god\|gd' alex.txt 
     gd
     god

#三、查詢幫助:
    man grep(簡單的幫助)
    查看詳細的幫助信息info grep

 

練習題

過濾文本(awk、sed)

一、請執行命令取出linux中eth0的IP地址(請用cut,有能力者也可分別用awk,sed命令答)node

思路
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的反向引用

 

二、如何取得/etc/hosts文件的權限對應的數字內容,如-rw-r--r-- 爲644,要求使用命令取得644或0644這樣的數字。linux

#方法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方法指定分隔符

 

三、已知/oldboy/test.txt 文件內容爲:正則表達式

oldboyshell

 

youxiaodao數據庫

 

pizzaexpress

請問如何把文件中的空行過濾掉(要求命令行實現)vim

#方法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

 

 

四、已知/oldboy/ett.txt 文件內容爲:api

oldboybash

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'

 

文件

五、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/..

 

 

六、請給出默認狀況eth0網卡配置文件的路徑及客戶端DNS的路徑。

 /etc/sysconfig/network-scripts/ifcfg-eth0
 /配置/系統配置/網絡-腳本/if(c f g)-eth0

 

 DNS的配置
 1./etc/resolv.conf
 2.網卡配置文件
 3.網卡配置文件裏面的DNS優先

 

替換

七、查找當前目錄下全部文件,並把文件中的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代碼,致使網站打開時就會調用這個地址,顯示廣告,形成很惡劣的影響,

 

解決方案:
#一、運營、網站用戶發現彈窗廣告
#二、運營報告給開發,開發聯繫運維,共同解決
#三、開發發現的問題就是,站點的目錄都被植入了js代碼
#四、運維人員解決問題:
##   1)運維備份原始出問題的原始文件
##   2)歷史備份覆蓋
##   3)find+sed覆蓋
#五、仔細查看日誌,尋找問題發現根源
#六、提供盲羊補牢解決方案(站點目錄嚴格權限規劃方案,以及新上線發佈規範思路)

 

echo的參數使用

八、請問在一個命令上加什麼參數能夠實現下面命令的內容在同一行輸出。
       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$

 

時間命令

九、請給出以下格式的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 ===> 周幾

 

 

十、擴展問題:打印三天前的日期,格式如: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環境變量

十一、【Centos 5.x】當從root用戶切到普通用戶pizza時,執行ifconfig會提示。command not found.

一、Linux運行命令過程
輸入命令
linux會在PATH裏面進行查找
運行
報錯

二、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環境變量

 

文件

十二、請描述下列路徑的內容是作什麼的?

/var/log/messages          系統默認的日誌
/var/log/secure            用戶的登陸信息
/etc/fstab                 開機的時候自動掛載列表  在開機的時候每一個磁盤分區對應着什麼入口的列表
/etc/profile               配置環境變量  別名
/var/spool/cron/root       定時任務的配置文件
/etc/hosts                 解析主機名
                          /etc/hosts                 主機名---->ip地址
                          DNS解析                     域名--->   ip過程

 



1三、如何快速查到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在線用戶

1四、請給出查看當前哪些用戶在線的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

顯示系統中全部用戶的最近一次的登陸信息

 

1五、如何正確關機和重啓

重啓:

init 6     將啓動級別改成重啓

reboot  馬上重啓

shutdown -r 1   一分鐘後重啓系統

shutdown -c     把正在關機或者重啓的命令取消掉,一臺遠程登陸重啓,另外一臺能夠在時間內中止這條命令

shutdown -r now  =====>至關於reboot

 

關機:

init 0

poweroff  會斷電(物理機)

halt     須要手動關閉電源(物理機)

shutdown -h 1

shutdown -h now   ======>至關於poweroff

 

1六、寫出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

 

1七、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快捷鍵
相關文章
相關標籤/搜索