linux-shell編程4:正則表達式

shell中的引號

* $

反斜線

反斜線跟在某個字符前面,示意爲轉義,顯示該字符原有含義
*  代表任意的    \*

單引號

單引號可以將它中間的所有任意字符還原爲字面意思,實現屏蔽shell元字符的功能
' **' '** ' #單引號再次成對出現
[root@localhost ~]# echo $HOME
/root
[root@localhost ~]# echo '$HOME'
$HOME
[root@localhost ~]# echo "$HOME"
/root
[root@localhost ~]# echo "\$HOME"
$HOME
[root@localhost ~]# echo 'hello'
hello
[root@localhost ~]# echo 'hello\'
hello\

雙引號

類似單引號,但是跟單引號略微有不同
他不會屏蔽  ` \  $  這三個元字符含義
若想屏蔽元字符含義需加轉義字符

[root@localhost ~]# echo "Hello world"
Hello world
[root@localhost ~]# echo "My name's BJTLXY."
My name's BJTLXY.
[root@localhost ~]# echo "$HOME"
/root
[root@localhost ~]# echo "\$HOME"
$HOME

反引號

反引號主要進行命令替換
#該功能可以使用$()來替換
[root@localhost ~]# echo "Today is `date +%D`"
Today is 11/14/18
[root@localhost ~]# echo "Today is $(date +%D)"
Today is 11/14/18

正則表達式(grep/egrep)

則表達式是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規則字符串”,這個“規則字符串”用來表達對字符串的一種過濾邏輯《百度百科》

常用正則表達式及含義

  • 正則表達式手冊
  • 30分鐘入門教程
  • 菜鳥教程

    as 匹配字母as
    . 匹配任意字符

    • 匹配前一個字符出現0次或者多次
    • 匹配前一個字符出現1次或者多次
      ? 匹配前一個表達式匹配0次或者一次,取消貪婪模式
      .* 貪婪模式 匹配任意多個任意字符
      [] 匹配集合中任意單個字符,括號中爲集合 [adc]
      [a-z] 匹配集合中的範圍
      ^ 匹配字符串的開頭
      $ 匹配字符串額結尾
      [^……] 匹配否定,類似取反
      | 匹配豎線倆遍的任何一個
      \ 轉義字符,匹配轉義後的字符串
      {n,m} 匹配前一個字符重複出現n到m次
      {n,} 匹配前一個字符重複出現至少n次
      () 將(與)之間的內容存儲在"保留空間,最大存儲9個"
      \n 通過\1\9調用保留空間中的內容

    #查找包含oot或ost的行
    grep o[os]t /tmp/passwd

    #查找包含數據0-9的行
    grep [0-9] /tmp/passwd
    grep [f-q] /tmp/passwd

    grep ^root /tmp/passwd

    grep bash$ /tmp/passwd

    #查找sbin/後面不跟n的行
    grep sbin/[^n] /tmp/passwd

    #查找數字0出現一次,倆次的行
    grep '0{1,2}' /tmp/passwd

    #查找包含倆個root的行,1表示保留空間()的第一個值,即:root
    grep "(root).*\1" /tmp/passwd

    #查找包含以root:開頭的行,並以:root結尾的行

    grep "(root)(:).*\2\1" /tmp/passwd

    #匹配空白行
    grep ^$ /tmp/passwd

    #匹配非空白行
    grep -v ^$ /tmp/passwd

    正則匹配出的是其中的某一行,但是想要打印匹配行的前幾行或者後幾行
    -A 打印匹配結果之後的行
    -B 打印匹配結果之前的行
    -C 分別打印出匹配結果之前以及之後的n行

    seq 類似python中range

    [root@localhost ~]# seq 10 | grep 5 -C 2
    3
    4
    5
    6
    7

拓展正則表達式(Extended Regular Expression)

{n,m}   等同於基本正則表達式\{n,m\}
+       匹配前一個字符出現一次或者多次
?       匹配前一個字符出現0次或者一次
|       匹配前/後字串  邏輯或
()      匹配正則集合

#查找數據0出現1下或者2次的行
[root@localhost ~]# grep '0{1,2}' /etc/passwd 
[root@localhost ~]# egrep '0{1,2}' /etc/passwd 
#查找至少出現一個0的行
[root@localhost ~]# egrep '0+' /tmp/passwd 
#查找包含root或者yuxiang的行
[root@localhost ~]# egrep '(root|yuxiang)' /tmp/passwd 

## cut按列切分文件
cut主要用於按列切分文件,針對csv文件或者說空格分割的文件(標準日誌文件)

1.-f 指定要提取的字段
    cut -f  FILED_LIST  filename

    FILED_LIST 需要顯示的列,列號之間用逗號分割

    #示例文件
    [root@localhost ~]# cat student_data.txt 
    No  Name    Mark    Percent
    1   Sarath  45  90
    2   Alex    49  98
    3   Anu 45  90

    #獲取文件第2,3列的值
    [root@localhost ~]# cut -f 2,3 student_data.txt 
    Name    Mark
    Sarath  45
    Alex    49
    Anu 45
    [root@localhost ~]# 

2.cut命令可以從stdin讀取輸入
    製表符默認爲分隔符,對於沒有使用分隔符的行,該命令會講文件原樣打印出來。cut的選項-s可以禁止原樣打印
    [root@localhost ~]# cut -f2 -s test.txt 
3.提取多列內容,有分隔符組成字段編號用逗號隔開
    [root@localhost ~]# cut -f2,3 student_data.txt 
4.可以使用--complement顯示出沒有被-f指定的字段(反選)
    [root@localhost ~]# cut -f1  --complement  student_data.txt 
    Name    Mark    Percent
    Sarath  45  90
    Alex    49  98
    Anu 45  90
    [root@localhost ~]# 
5.-d指定分隔符
    head -5 /tmp/passwd  | cut -d";" -f 1

指定字段的字節範圍

N-  從第N個字節,字符或者字段開始到行尾
N-M 從第N個字節,字符或者字段開始到第M個字節(包括M在內)
-M  從頭到第M個字節,字符或者字段

    -b  代表字節
    -c  代表字符
    -f  代表字段

vim a.txt
abcdefghiklmnopqrstuvwxyz
abcdefghiklmnopqrstuvwxyz
abcdefghiklmnopqrstuvwxyz
abcdefghiklmnopqrstuvwxyz
abcdefghiklmnopqrstuvwxyz

#打印2-5個字符
[root@localhost ~]# cut -c2-5 a.txt
#打印前倆個字符
[root@localhost ~]# cut -c -2 a.txt

#顯示多個區間內容,可以用--output-delimiter設置分隔符
[root@localhost ~]# cut a.txt -c1-3,6-9  --output-delimiter "……"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章