正則表達式、管道和重定向

1、什麼是正則表達式

正則表達式是一類字符所書寫的模式(pattern)取行:選擇,grep,egrep,fgrep   

使用正則表達式來描述選擇條件

正則表達式:基本正則表達式,擴展正則表達式

元字符:*,?這類字符不表示字符本身的意義,而用於額外功能性的描述

給定選取條件,只顯示符合條件的行  

    grep:默認支持基本正則表達式; 

    egerp:支持擴展正則表達式; 

    fgrep:不支持正則表達式元字符,快速搜索,所有的字符都當做字符本身

grep:簡單搜索,全局搜索基本正則表達式

grep [options] 'pattern' FILE

# grep 'root' /etc/passwd         #顯示含有root字符串的行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

基本正則表達式的元字符:

    ^:錨定行首的符合條件的內容,用法格式"^pattern"

# grep '^root' /etc/passwd
root:x:0:0:root:/root:/bin/bash

    $:錨定行尾的符合條件的內容,用法格式"pattern$"

# grep --color=auto 'sh$' /etc/passwd
root:x:0:0:root:/root:/bin/bash
oracle:x:500:500::/home/oracle:/bin/bash
hadoop:x:501:502::/home/hadoop:/bin/bash

        ^pattern$:以單詞開頭,並以其結尾

        ^$:空白行

    .:匹配任意單個字符

    *:匹配緊挨在其前面的字符任意次數

        a*b:ab,aab,acb,b

        .*:匹配任意長度的任意字符

    []:匹配指定範圍內的任意但個字符

    [^]:匹配指定範圍外的任意單個字符

    \?:匹配緊挨在其前面的字符0次或1次

a\?b:ab,aab,acb,b

    \{m,n\}:匹配其前面的字符至少m次,至多n次

        a\{1,3\}b:b,ab,aab,aaaab,abc

    \{0,n\}:至多n次,0-n次

    \{m,\}:至少m次

    \{m\}:精確匹配m次

    \<:錨定詞首,,用法格式:\<pattern

        \b:\bpattern

    \>:錨定詞尾,用法格式:pattern\>

\b:pattern\b

\<pattern\>:錨定單詞

    \(\):分組,用法格式:\(pattern\)

        \(ab\)\{1,3\}:ab,aab,abb,abab,ababab

        \(ab\).*\1:前面與後面一樣

# grep "\(gentoo\).*\1" /etc/passwd
gentoo:x:1001:1001:cao yuan lang:/home/gentoo:/bin/bash

grep的選項:

    --color=auto

        export GREP_COLOR='01;36'   01表示字體顏色(前景色),36表示背景顏色

    -v:反向選取,只顯示不符合模式的行

    -o:只顯示被模式匹配到的字符串,而不是正行

    -i:匹配時,不區分字符大小寫

    -A N:顯示匹配到的行的時候,順帶顯示其後面的N個行

    -B N:顯示匹配到的行的時候,順帶顯示其前面的N個行

    -C N:顯示匹配到的行的時候,順帶顯示其前面和後面的N個行

    -E:使用擴展的正則表達式

例:

顯示/proc/meminfo文件中以不區分大小的s開頭的行;

# grep "^[Ss]" /proc/meminfo

顯示/etc/passwd中以nologin結尾的行;

# grep "nologin$" /etc/passwd           
# grep "nologin$" /etc/passwd | wc -l      #顯示有多少行

取出默認shell爲/sbin/nologin的用戶列表

# grep "nologin$" /etc/passwd | cut -d: -f1

取出默認shell的bash,且其用戶ID號最小的用戶名

# grep "/bin/bash$" /etc/passwd | sort -n -t: -k3 | head -1 | cut -d: -f1   #-t 指定分隔符,-k指定第幾個字段進行排序

顯示/etc/rc.d/rc.sysinit中以#開頭,且後面跟一個或多個空白字符,而後面又跟了任意非空白字符的行

# grep "^#[[:spaec:]]\{1,\}[^[:space:]]" /etc/rc.d/rc.sysinit

顯示/etc/rc.d/rc.sysinit中符合形爲“任意單個字符n任意字符任意單個字符n”模式的行:即任意但個字符後面跟了個n,n後面有任意長度的任意字符,而後是任意單個字符後面跟了個n

# grep ".n.*.n" /etc/rc.d/rc.sysinit

顯示/etc/rc.d/rc.sysinit中符合形爲“任意單個字符n任意字符任意單個字符n”模式的行:即任意單個字符後面跟了個n,n後面有任意長度的任意字符,而後是任意單個字符後面跟了個n,但後面的n之前的字符要與前面的n之前的字符相同

# grep "\(.n\).*\1" /etc/rc.d/rc.sysinit

顯示/boot/grub/grub.conf文件中以一個或多個空白字符開頭的行

# grep "^#[[:spaec:]]\{1,\}" /boot/grub/grub.conf

找出某文件中的,1位數,或2位數

# grep "\<[0-9]\{1,2\}\>" /etc/rc.d/rc.sysinit    
# grep -w "[0-9]\{1,2\}" /etc/rc.d/rc.sysinit

找出ifconfig命令結果中的1-255之間的整數

ifconfig | grep

# ifconfig | egerp --color=auto "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"

100-199:1[0-9][0-9]

200-249:2[0-4][0-9]

250-255:25[0-5]

查找當前系統上名字爲student(必須出現在行首)的用戶的賬號的相關信息,文件爲/etc/passwd

# grep "^student:" /etc/passwd

擴展正則表達式元字符:

    .:任意單個字符

    []:匹配指定範圍內的任意但個字符

    [^]:匹配指定範圍外的任意單個字符

    *:匹配緊挨在其前面的字符任意次數

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

    ?:匹配緊挨在其前面的字符0次或1次

    {m,n}:至少m次,至多n次

    ():分組,支持引用\1,\2

    a|b:二選一

    \<:錨定詞首,,用法格式:\<pattern

        \b:\bpattern

    \>:錨定詞尾,用法格式:pattern\>

        \b:pattern\b

    \<pattern\>:錨定單詞

     ^:錨定行首的符合條件的內容,用法格式"^pattern"

    $:錨定行尾的符合條件的內容,用法格式"pattern$"

# egrep "c|Cat" /root/test.txt
c,Cat
# egrep "(c|C)at" /root/test.txt
cat,Cat

fgrep:fist

sort:排序

    -f:忽略大小寫

    -n:以數值大小進行排序:默認以ASCII表中的數字大小排序

    -r:逆序排序

    -u:移除重複的行,具有相同內容的行只保留一個

        只有兩行一模一樣,並且挨着,纔算是重複的行

    -R:隨機排序

    -t:指定分隔符

    -k:指定用第幾個字段進行排序

uniq:

    -c:統計每行重複的

    -u:只顯示沒有重複的行

    -d:只顯示重複過的行

# sort sort.txt | uniq -c
    1 First line.
    1 Four line.
    1 How are you?
    2 Second line.
    2 Third line.
# sort sort.txt | uniq -d
    Second line.
    Third line.
# sort sort.txt | uniq -u
    First line.
    Four line.
    How are you?

文本處理三劍客:grep,sed,awk


2、重定向

Linux I/O重定向,管道

I/O:這是一種統稱

Linux爲應用程序提供了I/O重定向的功能

程序本身要有輸入輸出的功能

爲了安全起見,所以輸入輸出都標準化了,標準輸入是鍵盤,標準輸出是監視器(顯示器),錯誤輸出也是監視器

每一個內核打開的文件都有一個文件描述符:file disciptor,FD

標準輸入FD:0    標準輸出FD:1    錯誤輸出FD:2

將其默認數據流改爲其他設備,就稱爲IO重定向

輸出重定向:

    1>:覆蓋重定向,即覆蓋文件裏面的內容         1可以省略

set -C:避免覆蓋已經存在的文件的內容

set +C:關閉上述功能

    1>>:追加重定向        1可以省略

    /dev/null:數據黑洞,bit bucket

錯誤重定向:

    2>:覆蓋重定向

    2>>:追加重定向

">"改成">>"則表示把輸出追加到filename文件的末尾,如果文件不存在則創建它。

同時重定向標準輸出和錯誤輸出:

    COMMAND > /path/to/stdout 2> /path/to/error

標準輸出和錯誤輸出定向至一個文件:

    &>

    &>>

    COMMAND &> /path/to/somewhere  或  COMMAND > /path/to/somewhere 2>&1

輸入重定向:

    <:

    COMMAND < /from/somewhere

<<:Here Document,此處創建文檔

    cat > /path/to/somefile << EOF          通常用於腳本中生成文檔

    cat << EOF      通常用於腳本中向用戶輸出大段信息


3、管道

管道:|

COMMAND1 | COMMAND2 | COMMAND3 |...

管道的最後一個命令是在當前shell的子shell中執行

多道輸出:

    tee

    COMMAND1 | tee /path/to/somefile

# ifconfig | grep "inet addr:" | grep -v '127.0.0.1' | cut -d:-f2 | cut -d' ' -f1
192.168.1.1

例:

統計/usr/bin/目錄下的文件個數

# ls /usr/bin | wc -l

取出當前系統上所有用戶的shell,要求每種shell只顯示一次,並且按順序進行顯示

# cut -d: -f7 /etc/passwd | sort -u | grep -v "^$"

如何顯示/var/log目錄下每個文件的內容類型?

# file /var/log/*     或  # cd /var/log ; file 'ls /var/log'

取出/etc/inittab文件的第5行

# head -5 /etc/inittab | tail -1

取出etc/passwd文件中倒數第9個用戶的用戶名和shell,顯示到屏幕上並將其保存至/tmp/users.txt文件中

# tail -9 /etc/passwd | head -1 | cut -d: -f1,7 | tee /tmp/users.txt

顯示/etc目錄下所有以pa開頭的文件,並統計其個數

# ls /etc/pa* | wc -l

不使用文件編輯器,將alias cle=clear一行內容添加至當前用戶的.bashrc文尾部

# echo 'alias cls=clear' >> ~/.bashrc


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章