Shell腳本學(xué)習(xí)指南之查找與替換介紹
3.1 查找文本
grep:使用POSIX定義的基本正則表達(dá)式(BRE)。
egrep:使用擴(kuò)展正則表達(dá)式(ERE)。
fgrep:快速grep。使用優(yōu)化的算法,匹配固定字符串而非正則表達(dá)式。
1992 POSIX標(biāo)準(zhǔn)將這三個(gè)改版整合成一個(gè)grep程序。
$ who | grep -F austen
使用-F選項(xiàng)查找固定字符串。事實(shí)上,只要匹配的模式里未含有正則表達(dá)式的meta字符,
則grep默認(rèn)行為模式就等同于使用了-F。
3.2.6 在文本文件里進(jìn)行替換
一般來(lái)說(shuō),執(zhí)行文本替換的正確程序應(yīng)該是sed - 流編輯器。
sed 's/:.*//' /etc/passwd | 刪除第一個(gè)冒號(hào)之后的所有東西
sort -u 排序列表并刪除重復(fù)部分
任何可顯示的字符都能作為定界符。
sed 's;/home/tolstoy/;/home/lt/;'
sed 's/\\/\\/g'
用-e和-f選項(xiàng),不用將多個(gè)sed通過(guò)管道串起來(lái),就可以一次替換多個(gè)。
$ 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的運(yùn)作
命令行上的每個(gè)文件名會(huì)依次打開(kāi)與讀取。如果沒(méi)有文件,則使用標(biāo)準(zhǔn)輸入。
sed讀取每個(gè)文件,一次讀一行,將讀取的行放到內(nèi)存的一個(gè)區(qū)域(模式空間)。
所有編輯上的操作都會(huì)應(yīng)用到模式空間的內(nèi)容,當(dāng)所有操作完成后,sed會(huì)將模式
空間的最后內(nèi)容打印到標(biāo)準(zhǔn)輸出,再回到開(kāi)始處,讀取另一個(gè)輸入行。
3.3 字段處理
用空格(制表符)或特定的定界符(如冒號(hào))。
#字符起始的行表示注釋,軟件必須可忽略這樣的行才行。
以定界符分隔字段的最好例子就是/etc/passwd了:一行表示一個(gè)用戶,每個(gè)字段以冒號(hào)隔開(kāi)。
該文件含有7個(gè)字段:
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連接字段
以一個(gè)共同的鍵值(主字段)將多個(gè)文件結(jié)合在一起。
$ cat sales
#業(yè)務(wù)員 數(shù)據(jù)量
joe 100
jane 200
herman 150
chris 300
$ cat quotas
#業(yè)務(wù)員 配額
joe 50
jane 75
herman 80
chris 95
#! /bin/sh
# merge-sales.sh
# 刪除注釋并排序數(shù)據(jù)文件
sed '/^#/d' quotas | sort > quotas.sorted
sed '/^#/d' sales | sort > sales.sorted
# 以第一個(gè)鍵值作結(jié)合
join quotas.sorted sales.sorted
# 刪除緩存文件
rm quotas.sorted sales.sorted
3.3.4 使用awk重新編排字段
awk程序基本架構(gòu):pattern { action }
pattern通常是由斜杠括起來(lái)的ERE,action通常是一個(gè)明了的print語(yǔ)句。
省略pattern則會(huì)對(duì)每一條輸入記錄執(zhí)行action,省略action則等同于{ print }。
awk自動(dòng)將各個(gè)記錄分為字段,并將每條記錄內(nèi)字段數(shù)目存儲(chǔ)到內(nèi)建變量NF。
默認(rèn)以空白分隔,還可以將FS變量設(shè)置為一個(gè)不同的值。$加數(shù)字表示字段值。
awk '{ print $1 }' 打印第1個(gè)字段
awk '{ print $2, $5 }' 打印第2與第5個(gè)字段
awk '{ print $1, $NF }' 打印第一個(gè)與最后一個(gè)字段
awk 'NF > 0 { print $0 }' 打印非空行
awk 'NF > 0' 同上
awk -F : '{ print $1, $5 }' /etc/passwd 設(shè)置字段分隔字符,-F選項(xiàng)自動(dòng)設(shè)置FS變量。
root root
...
tolstoy Leo Tolstoy
記得在print的參數(shù)間用逗號(hào)隔開(kāi),否則awk將連接相鄰的所有值。
awk -F: '{ print "User" $1 "is really" $5 }' /etc/passwd
Userrootis reallyroot
...
Usertolstoyis reallyLeo Tolstoy
相關(guān)文章
Shell腳本對(duì)比兩個(gè)文本文件找出不同行的2個(gè)方法分享
這篇文章主要介紹了Shell腳本對(duì)比兩個(gè)文本文件找出不同行的2個(gè)方法分享,本文分別使用comm命令法、grep命令法實(shí)現(xiàn),需要的朋友可以參考下2014-12-12shell腳本中echo顯示內(nèi)容帶顏色的實(shí)現(xiàn)方法
這篇文章主要介紹了shell腳本中通過(guò)echo顯示帶顏色內(nèi)容的實(shí)現(xiàn)方法,需要的朋友可以參考下2013-11-11監(jiān)視磁盤使用情況的Shell腳本(本地+遠(yuǎn)程)
任何一個(gè)分區(qū)使用到90%就發(fā)送一個(gè)郵件給指定的收件人,到95%就在郵件主題出警告(warning),說(shuō)明發(fā)送郵件程序EMAIL2013-01-01shell腳本快速創(chuàng)建格式化磁盤與詳細(xì)操作步驟
這篇文章主要介紹了shell腳本快速創(chuàng)建格式化磁盤與詳細(xì)操作步驟,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01Linux Shell 常見(jiàn)的命令行格式簡(jiǎn)明總結(jié)
這篇文章主要介紹了Linux Shell 常見(jiàn)的命令行格式簡(jiǎn)明總結(jié),非常實(shí)用,需要的朋友可以參考下2014-04-04