天天看點

linux腳本中$指令,linux下shell腳本中sed指令的用法

先來給一個案例:

#将old.sql檔案中的符号“|”替換為“,”,并儲存到test.sql檔案中

sed "s/|/,/g" "old.sql"> test.sql

#将test.sql檔案中的每一行最後的符号“,”删除

sed -i 's/,$//g' test.sql

#在test.sql檔案中每行的開頭添加左括号“(”

sed -i 's/^/(&/g' test.sql

#在test.sql檔案中每一行的末尾添右括号“)”

sed -i 's/$/&)/g' test.sql

#統計檔案old.sql的行數

c=`sed -n '$=' /home/work/BaikalDB/tpch/load/data_tbl/old.sql`

#在test.sql檔案的第3行~3+99行的末尾添右括号“,”

sed -i "3,+99 s/$/&,/" test.sql

#在test.sql檔案的第n行的開頭添加“insert into table values”,這裡的可以為具體的數字,也可以為變量的值,如j變量:${j}

sed -i "niinsert into table values " test.sql

#将test.sql檔案的最後一行末尾的“,”換成“;”,這裡的可以為具體的數字,也可以為變量的值,如j變量:${j}

sed -i "ns/,$/;/" test.sql

一個簡單的入門

linux腳本中$指令,linux下shell腳本中sed指令的用法

如圖,一個簡單的sed指令包含三個主要部分:參數、範圍、操作。要操作的檔案,可以直接挂在指令行的最後。除了指令行,sed也可以通過-f參數指定一個sed腳本,這個屬于進階用法,不做過多描述。

有些示例指令我會重複多次,聰明如你一定能發現其中規律,有時連解釋都用不着。

參數

-n 這個參數是--quiet或者--silent的意思。表明忽略執行過程的輸出,隻輸出我們的結果即可。

我們常用的還有另外一個參數 :-i。

使用此參數後,所有改動将在原檔案上執行。你的輸出将覆寫原檔案。非常危險,一定要注意。

範圍

1,4 表示找到檔案中1,2,3,4行的内容。

這個範圍的指定很有靈性,請看以下示例(請自行替換圖中的範圍部分)。

5 選擇第5行。

2,5 選擇2到5行,共4行。

1~2 選擇奇數行。

2~2 選擇偶數行。

2,+3 和2,5的效果是一樣的,共4行。

2,$ 從第二行到檔案結尾。

範圍的選擇還可以使用正則比對。請看下面示例。

/sys/,+3 選擇出現sys字樣的行,以及後面的三行。

/\^sys/,/mem/ 選擇以sys開頭的行,和出現mem字樣行之間的資料。

為了直覺,下面的指令一一對應上面的介紹,範圍和操作之間是可以有空格的。

操作

最常用的操作就是p,意思就是列印。比如,以下兩個指令就是等同的:

除了列印,還有以下操作,我們來說常用的。

p 對比對内容進行列印。

d 對比對内容進行删除。這個時候就要去掉-n參數了,想想為什麼。

w 将比對内容寫入到其他地方。

a,i,c等操作雖基本但使用少,不做介紹。我們依然拿一些指令來說明。

替換模式

以上是sed指令的常用比對模式,但它還有一個強大的替換模式,意思就是查找替換其中的某些值,并輸出結果。使用替換模式很少使用-n參數。

linux腳本中$指令,linux下shell腳本中sed指令的用法

替換模式的參數有點多,但第一部分和第五部分都是可以省略的。替換後會将整個文本輸出出來。

前半部分用來比對一些範圍,而後半部分執行替換的動作。

範圍

這個範圍和上面的範圍文法類似。看下面的例子。

/sys/,+3 選擇出現sys字樣的行,以及後面的三行。

/\^sys/,/mem/ 選擇以sys開頭的行,和出現mem字樣行之間的資料。

具體指令為:

指令

這裡的指令是指s。也就是substitute的意思。

查找比對

查找部分會找到要被替換的字元串。這部分可以接受純粹的字元串,也可以接受正規表達式。看下面的例子。

a 查找範圍行中的字元串a。

[a,b,c] 從範圍行裡查找字元串a或者b或者c。

指令類似:

替換

是時候把找出的字元串給替換掉了。本部分的内容将替換查找比對部分找到的内容。

可惜的是,這部分不能使用正則。常用的就是精确替換。比如把a替換成b。

但也有進階功能。和java或者python的正則api類似,sed的替換同樣有Matched Pattern的含義,同樣可以得到Group,不深究。常用的替位符,就是&。

&号,再重複一遍。當它用在替換字元串中的時候,代表的是原始的查找比對資料。

[&] 表明将查找到的資料使用[]包圍起來。

“&” 表明将查找的資料使用””包圍起來。

下面這條指令,将會把檔案中的每一行,使用引号包圍起來。

flag 參數

這些參數可以單個使用,也可以使用多個,僅介紹最常用的。

g 預設隻比對行中第一次出現的内容,加上g,就可以全文替換了。常用。

p 當使用了-n參數,p将僅輸出比對行内容。

w 和上面的w模式類似,但是它僅僅輸出有變換的行。

i 這個參數比較重要,表示忽略大小寫。

e 表示将輸出的每一行,執行一個指令。不建議使用,可以使用xargs配合完成這種功能。

看兩個指令的文法:

好玩

由于正則的關系,很多字元需要轉義。你會在腳本裡做些很多\\,\*之類的處理。你可以使用|^@!四個字元來替換\。

比如,下面五個指令是一樣的。

注意:前半部分的範圍是不能使用這種方式的。我習慣使用符号@。

其他

正規表達式

可以看到,正規表達式在指令行中無處不在。以下,緊做簡要說明。

^ 行首

$ 行尾

. 單個字元

* 0個或者多個比對

+ 1個或者多個比對

? 0個或者1個比對

{m} 前面的比對重複m次

{m,n} 前面的比對重複m到n次

\ 轉義字元

[0-9] 比對括号中的任何一個字元,or的作用

| or,或者

\b 比對一個單詞。比如\blucky\b 隻比對單詞lucky

參數i

上面已經簡單介紹了參數i,它的作用是讓操作在原檔案執行。無論你執行了啥,原始檔案都将會被覆寫。這是非常危險的。

通過加入一個參數,可以将原檔案做個備份。

以上指令會對原file檔案生效,并生成一個file.bak檔案。強烈建議使用i參數同時指定bak檔案。

表演一下

我們通過兩個指令,來稍微看下sed和其他指令組合起來的威力。

輸出長度不小于50個字元的行

統計檔案中有每個單詞出現了多少次

查找目錄中的py檔案,删掉所有行級注釋

檢視第5-7行和10-13行

僅輸出ip位址

End

Linux下shell腳本中信号捕獲和函數練習腳本之ping一個網段

該腳本主要的目的是練習在Linux bash腳本中捕獲信号,順便練習一下函數的使用,還有就是終止一個正在運作的程式後,該程式打開的檔案的後續處理問題等等!腳本功能:  ping一個網段内的IP,檢測哪 ...

linux下shell 腳本 中windows換行符換成linux換行符

sed -i 's/\r//' filename window下預設是 \r\n linux下是\n unix下是\r

詳解Linux互動式shell腳本中建立對話框執行個體教程_linux伺服器

本教程我們通過實作來講講Linux互動式shell腳本中建立各種各樣對話框,對話框在Linux中可以友好的提示操作者,感興趣的朋友可以參考學習一下. 當你在終端環境下安裝新的軟體時,你可以經常看到資訊 ...

Linux/Unix shell 腳本中調用SQL,RMAN腳本

Linux/Unix shell腳本中調用或執行SQL,RMAN 等為自動化作業以及多次反複執行提供了極大的便利,是以通過Linux/Unix shell來完成Oracle的相關工作,也是DBA必不可 ...

shell腳本中sqlite3指令查詢資料庫失敗傳回空,并将錯誤資訊列印到标準錯誤輸出

shell腳本中sqlite3指令查詢資料庫失敗傳回空,并将錯誤資訊列印到标準錯誤輸出 如: #/bin/sh local ret='sqlite3 test.db "select test ...

linux下shell腳本執行jar檔案

最近在搞一個shell腳本啟動jar檔案個關閉jar檔案的東東.搞得我都蛋疼了.今天晚上終于弄好了 話說,小弟的linux隻是剛入門,經過各方查資料終于搞定了.話不多說,下面開始上小弟寫的shell腳 ...

linux下shell腳本學習

在Linux系統中,雖然有各種各樣的圖形化接口工具,但是sell仍然是一個非常靈活的工具.Shell不僅僅是指令的收集,而且是一門非常棒的程式設計語言.您可以通過使用shell使大量的任務自動化,shel ...

shell腳本中常用指令

1           Shell中的特殊符号 1.1           $  美元符号.用來表示變量的值.如變量NAME的值為Mike,則使用$NAME就可以得到“Mike”這個值. 1.2    ...

linux下shell腳本啟動jar包

本文采用的jar包是通過idea下maven打包的springboot項目. 寫這個shell腳本是為了在linux下友善啟動jar包時不用輸入太多的shell指令,将啟動腳本的一系列shell指令整 ...

随機推薦

String.prototype運用

1.去掉字元串前後空格 String.prototype.ltrim = function () { return this.replace(/^\s+/, ""); } Stri ...

在python中使用圖形庫matplotlib

matplotlib is a python 2D plotting library which produces publication quality figures in a variety o ...

JBOSS通過Apache負載均衡方法一:使用mod_jk

JBOSS通過Apache負載均衡方法一:使用mod_jk   本文第一.二節分别對Linux環境下前端使用Apache以及windows環境下前端使用IIS通過AJP協定和後端的JBOSS通信實作負 ...

HDU 1280 前m大的數【哈希入門】

題意:中文的題目= =将各種組合可能得到的和作為下标,然後因為不同組合得到的和可能是一樣的, 是以再用一個數組num[]數組,就可以将相同的和都記錄下來 #include

HDU 4721 Food and Productivity (二分+樹狀數組)

轉載請注明出處,謝謝http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 題意 :給出n * m的格子,每個格子有兩個屬性f ...

vue 通過自定義指令實作 置頂操作;

項目需求:要求目前項目每個頁面滑到超出一屏的距離時,出現 backTop 按鈕,點選則回到最頂端:俗稱置頂操作: 因為涉及到的頁面較多,每個頁面都加肯定顯得重複累贅,最終想到了 Vue 的自定義指令  ...

.net core在Linux下擷取AD域資訊

.net core在Linux下擷取AD域資訊 .net Core 2.1.4 .net core現在System.DirectoryServices隻支援Windows平台下使用. 參考: http ...

cProfile——Python性能分析工具

Python自帶了幾個性能分析的子產品:profile.cProfile和hotshot,使用方法基本都差不多,無非子產品是純Python還是用C寫的.本文介紹cProfile.  例子 import t ...

Understanding the managed heap

Understanding the managed heap   Another common problem faced by many Unity developers is the unexpe ...

iOS 線程操作庫 PromiseKit

iOS 線程操作庫 PromiseKit 官網:http://promisekit.org/ github:https://github.com/mxcl/PromiseKit/tree/master ...