4.3Linux文本處理工具

解釋型語言: 源程序經過翻譯一條執行一條      解釋器
編譯型語言: 事先把全部源程序都翻譯好        編譯器linux

        bash編程:
            指令:OS上可運行的命令
                翻譯:在當前OS上查找相應命令並提交給內核的執行的過程。git

            程序控制語句:
             順序執行、選擇執行、循環執行正則表達式

Linux文本處理工具:
    文本搜索   查找文件中符合特定條件的行shell

        globbing: 通配符    元字符
            *:p*dexpress

        /etc/passwd: root編程

    文本搜索工具:grep, egrep, fgrepbash

        Global search REgular expression and Print out the line.  全局搜索正則表達式而且輸出工具

        文本搜索工具,根據用戶指定的文本模式(搜索條件)對目標文件進行逐行搜索,顯示能匹配到的行。this

        語法格式:
            grep [option]... 'PATTERN' FILE...spa

                --color=auto  指定匹配的模式用顏色來顯示

        正則表達式:
            是一類字符所書寫的模式,其中許多字符不表示其字面意義,而是表達控制或通配等功能;
                元字符:不表示其字面意義,而用於額外功能性描述
正則表達式權威指南 書籍

            正則表達式:正則表達式引擎(能理解正則表達式,是由程序自身實現的)

            基本正則表達式:grep
            擴展正則表達式: egrep, grep -E
            fgrep: fast, 不支持使用正則表達式

        基本正則表達式中的元字符:
            字符匹配:
                .: 匹配任意單個字符
[root@linux_basic ~]#alias grep='grep --color=auto'
[root@linux_basic ~]#grep "r..t" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin               
                []: 匹配指定範圍內的任意單個字符
                    [0-9], [[:digit:]]
                    [a-z], [[:lower:]]
                    [A-Z], [[:upper:]]
                    [[:space:]]  空格
                    [[:punct:]] 標點符號
                    [[:alpha:]] 全部字母
                    [[:alnum:]] 字母和數字
                [^]:
            次數匹配元字符:用於實現指定其前面的字符所可以出現的次數
                *: 任意長度,它前面的字符能夠出現任意次
                    例如:x*y
                        xxy, xyy, y,
                \?: 0次或1次,它前面的字符是無關緊要的
        [root@linux_basic ~]#grep "r\?oot" /etc/passwd
                    例如:x\?y
                        xy, y, ay  不是整串,字串匹配也會顯示
                \{m\}: m次,它前的字符要出現m次
        [root@linux_basic ~]#grep "o\{2\}" /etc/passwd
                    例如:x\{2\}y
                        xy, xxy, y, xxxxy, xyy
                \{m,n\}: 至少m次,至多n次
        [root@linux_basic ~]#grep "o\{0,3\}" /etc/passwd
                    例如:x\{2,5\}y
                        xy, y, xxy
                \{m,\}:至少m次
        [root@linux_basic ~]#grep "o\{2\}" /etc/passwd
                \{0,n\}: 至多n次

                .*:任意長度的任意字符
         [root@linux_basic ~]#grep "r.*t" /etc/passwd

                    工做於貪婪模式:儘量多的去匹配
            位置錨定:
                ^: 行首錨定; 脫字符號
                    寫在模式最左側
                $: 行尾錨定:
                    寫在模式最右側
                ^$: 空白行

                不包含特殊字符的連續字符組成的串叫單詞:
                \<: 詞首,出現於單詞左側,\b
                    \<char
          [root@linux_basic ~]#grep "\<r..t" /etc/passwd
                \>: 詞尾,出現於單詞右側, \b
                    char\>
         [root@linux_basic ~]#grep "l..e\>" /etc/passwd

           \< xxxxx\>   用來作精確錨定的  ??  ifconfig |grep -E "\<([0-9]|[1-9][0-9])\>"  左半邊和右半邊
                                                ifconfig |grep -E "\<[0-9]|[1-9][0-9]\>"
          [root@linux_basic ~]#grep "\<root\>" /etc/passwd

            分組:
                \(\)
                    例如:\(ab\)*    使用\來轉義的
                    分組中的模式匹配到的內容,可由正則表達式引擎記憶在內存中,以後可被引用

             [root@linux_basic ~]#grep "\(root\)\{1\}" /etc/passwd
                引用:
                    例如\(ab\(x\)y\).*\(mn\)   在嵌套的括號中,中間兩個最近的括號爲一組的
                        有編號:自左然後的左括號,以及與其匹配右括號
                        \(a\(b\(c\)\)mn\(x\)\).*\1

                \#: 引用第n個括號所匹配到的內容,而非模式自己
                    例如:
                        \(ab\?c\).*\1   b出現0次或1次

                            abcmnaaa
                            abcmnabc
                            abcmnac
                            acxyac

        grep命令選項:
            -v: 反向選取
-v, --invert-match
      Invert the sense of matching, to select non-matching lines.  (-v is specified by POSIX.)
            -o: 僅顯示匹配的字串,而非字串所在的行
-o, --only-matching
      Print only the matched (non-empty) parts of a matching line, with each such part on a separate
      output line.           
            -i: ignore-case,忽略字符大小寫
-i, --ignore-case
      Ignore case distinctions in both the PATTERN and the input files.  (-i is specified by POSIX.)           
            -E: 支持使用擴展正則表達式
-E, --extended-regexp
      Interpret  PATTERN  as  an  extended regular expression (ERE, see below).  (-E is specified by
      POSIX.)
            -A #   匹配到對應的行及其下面#行
-A NUM, --after-context=NUM
    Print  NUM  lines  of trailing context after matching lines.  Places a line containing a group
    separator (--) between contiguous groups of matches.  With the -o or  --only-matching  option,
    this has no effect and a warning is given.           
[root@linux_basic ~]#grep -A 1 "root" /etc/passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
--
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
            -B #   匹配到對應的行及其上面#行
-B NUM, --before-context=NUM
      Print  NUM  lines  of leading context before matching lines.  Places a line containing a group
      separator (--) between contiguous groups of matches.  With the -o or  --only-matching  option,
      this has no effect and a warning is given.           
[root@linux_basic ~]#grep -B 2 "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
--
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
            -C #   匹配到對應的行及其上下面#行
-C NUM, -NUM, --context=NUM
      Print  NUM  lines  of output context.  Places a line containing a group separator (--) between
      contiguous groups of matches.  With the -o or --only-matching option, this has no effect and a
      warning is given.           
[root@linux_basic ~]#grep -C 2 "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
--
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin

        練習:
            一、顯示/proc/meminfo文件中以大寫或小寫S開頭的行;
            # grep -i '^s' /proc/meminfo
            # grep '^[Ss]' /proc/meminfo

            # grep -E '^(S|s)' /proc/meminfo

            二、顯示/etc/passwd文件中其默認shell爲非/sbin/nologin的用戶;
            # grep -v "/sbin/nologin$" /etc/passwd | cut -d: -f1

            三、顯示/etc/passwd文件中其默認shell爲/bin/bash的用戶;
                進一步:僅顯示上述結果中其ID號最大的用戶;
            # grep "/bin/bash$" /etc/passwd | sort -t: -k3 -n | tail -1 | cut -d: -f1               

            四、找出/etc/passwd文件中的一位數或兩位數;
            # grep "\<[0-9][0-9]\?\>" /etc/passwd
            # grep "\<[0-9]\{1,2\}\>" /etc/passwd

            五、顯示/boot/grub/grub.conf中以致少一個空白字符開頭的行;
            # grep "^[[:space:]]\{1,\}" /boot/grub/grub.conf

            六、顯示/etc/rc.d/rc.sysinit文件中,以#開頭,後面跟至少一個空白字符,然後又有至少一個非空白字符的行;
            # grep "^#[[:space:]]\{1,\}[^[:space:]]\{1,\}" /etc/rc.d/rc.sysinit

            七、找出netstat -tan命令執行結果中以'LISTEN'結尾的行;
            # netstat -tan | grep "LISTEN[[:space:]]*$"

            八、添加用戶bash, testbash, basher, nologin(SHELL爲/sbin/nologin),而找出當前系統上其用戶名和默認shell相同的用戶;             # grep "^\([[:alnum:]]\{1,\}\):.*\1$" /etc/passwd

相關文章
相關標籤/搜索