Shell指令碼學習指南之尋找與替換介紹_linux shell

來源:互聯網
上載者:User

3.1 尋找文本
grep:使用POSIX定義的基本Regex(BRE)。
egrep:使用擴充Regex(ERE)。
fgrep:快速grep。使用最佳化的演算法,匹配固定字串而非Regex。

1992 POSIX標準將這三個改版整合成一個grep程式。

$ who | grep -F austen
使用-F選項尋找固定字串。事實上,只要匹配的模式裡未含有Regex的meta字元,
則grep預設行為模式就等同於使用了-F。

3.2.6 在文字檔裡進行替換
一般來說,執行文本替換的正確程式應該是sed - 流編輯器。
sed 's/:.*//' /etc/passwd |     刪除第一個冒號之後的所有東西
sort -u   排序列表並重複資料刪除部分

任何可顯示的字元都能作為定界符。

複製代碼 代碼如下:

sed 's;/home/tolstoy/;/home/lt/;'
sed 's/\\/\\/g'

用-e和-f選項,不用將多個sed通過管道串起來,就可以一次替換多個。

複製代碼 代碼如下:

$ sed -e 's/foo/bar/g' -e 's/chicken/cow/g' file1.xml > file2.xml

$ cat fixup.sed
s/foo/bar/g
s/chicken/cow/g
...
$ sed -f fixup.sed file1.xml > file2.xml

3.2.8 sed的運作
命令列上的每個檔案名稱會依次開啟與讀取。如果沒有檔案,則使用標準輸入。
sed讀取每個檔案,一次讀一行,將讀取的行放到記憶體的一個地區(模式空間)。
所有編輯上的操作都會應用到模式空間的內容,當所有操作完成後,sed會將模式
空間的最後內容列印到標準輸出,再回到開始處,讀取另一個輸入行。

3.3 欄位處理
用空格(定位字元)或特定的定界符(如冒號)。
#字元起始的行表示注釋,軟體必須可忽略這樣的行才行。

以定界符分隔欄位的最好例子就是/etc/passwd了:一行表示一個使用者,每個欄位以冒號隔開。
該檔案含有7個欄位:
tolstoy:x:2076:10:Leo Tolstoy:/home/tolstoy:/bin/bash
1.使用者名稱稱:2.加密後密碼:3.使用者ID:4.使用者組ID:5.姓名:6.根目錄:7.登入的Shell。

3.3.2 使用cut選定欄位

複製代碼 代碼如下:

$ cut -d : -f 1,5 /etc/passwd
root:root
...
tolstoy:Leo Tolstoy
$ cut -d : -f 6 /etc/passwd
/root
...
/home/tolstoy

3.3.3 使用join串連欄位
以一個共同的索引值(主欄位)將多個檔案結合在一起。
$ cat sales
#業務員 資料量
joe     100
jane    200
herman 150
chris    300

$ cat quotas
#業務員 配額
joe     50
jane    75
herman 80
chris    95

複製代碼 代碼如下:

#! /bin/sh
# merge-sales.sh
# 刪除注釋並排序資料檔案
sed '/^#/d' quotas | sort > quotas.sorted
sed '/^#/d' sales   | sort > sales.sorted
# 以第一個索引值作結合
join quotas.sorted sales.sorted
# 刪除快取檔案
rm quotas.sorted sales.sorted

3.3.4 使用awk重新編排欄位

awk程式基本架構:pattern { action }
pattern通常是由斜杠括起來的ERE,action通常是一個明了的print語句。
省略pattern則會對每一條輸入記錄執行action,省略action則等同於{ print }。

awk自動將各個記錄分為欄位,並將每條記錄內欄位數目儲存到內建變數NF。
預設以空白分隔,還可以將FS變數設定為一個不同的值。$加數字表示欄位值。
awk '{ print $1 }'               列印第1個欄位
awk '{ print $2, $5 }'          列印第2與第5個欄位
awk '{ print $1, $NF }'        列印第一個與最後一個欄位
awk 'NF > 0 { print $0 }'     列印非空行
awk 'NF > 0'                     同上

awk -F : '{ print $1, $5 }' /etc/passwd     設定欄位分隔字元,-F選項自動化佈建FS變數。
root root
...
tolstoy Leo Tolstoy

記得在print的參數間用逗號隔開,否則awk將串連相鄰的所有值。
awk -F: '{ print "User" $1 "is really" $5 }' /etc/passwd
Userrootis reallyroot
...
Usertolstoyis reallyLeo Tolstoy

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.