sed簡介:流編輯工具,用來對文本進(jìn)行過濾與替換操作。
成都創(chuàng)新互聯(lián)是一家專業(yè)提供沙灣企業(yè)網(wǎng)站建設(shè),專注與成都做網(wǎng)站、網(wǎng)站建設(shè)、H5網(wǎng)站設(shè)計(jì)、小程序制作等業(yè)務(wù)。10年已為沙灣眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進(jìn)行中。
sed流程:sed通過一次僅讀取一行內(nèi)容來對某些指令進(jìn)行處理后輸出。
1、sed通過文件或管道讀取文件內(nèi)容,但sed默認(rèn)并不直接修改源文件,而是將讀入的內(nèi)容復(fù)制到緩沖區(qū)中,稱之為模式空間。
2、所有的指令操作都是孝判在模式空間找那個進(jìn)行
3、sed根據(jù)相應(yīng)的指令對模式空間中的內(nèi)容進(jìn)行處理并輸出結(jié)果,默認(rèn)輸出至標(biāo)準(zhǔn)輸出(即屏幕上)。
sed基本語法格式:
用法:sed[選巧灶改項(xiàng)]...{腳本指令}[輸入文件]...
選項(xiàng): -version 顯示sed版本
-help :顯示幫助文檔
-n,-quiet,-silent靜默輸出,默認(rèn)情況下,sed程序在所有的腳本指令執(zhí)行完畢后,將自動打印模式空間中的內(nèi)容。
-e script允許多個腳本指令被執(zhí)行
-f script-file從文件中讀取腳本指令,對編寫自動化腳本程序很實(shí)用
-i ,-in-place 該選項(xiàng)直接修改源文件
-l N 該選項(xiàng)指定l指令可以輸出的行長度,l指令為輸出非打印字符。
-posix 禁用GNU sed擴(kuò)展功能。
-r 在腳本指令辯察中使用擴(kuò)展正則表達(dá)式。
-s,-separate 默認(rèn)情況下,sed將把輸入的多個文件名作為一個長的連續(xù)的輸入流。而GNU sed則允許把它們當(dāng)作單獨(dú)的文件。
-u,-unbuffered 最低限度的緩存輸入與輸出
a,append表示追加指令;
i,insert表示插入指令;
d,delete表示刪除指令;
s,substitution表示替換指令。
sed腳本指令的基本格式是:
[地址,即路徑]命令(有些命令僅可以對一行操作,有些可以對多行操作),命令也可以用花括號進(jìn)行組合,使命令序列可以作用于同一個地址。
address{
command1
command2
command3
}
sed的基本工作方式是:
sed的替換命令s:
1、全局替換 : s/old/new/g ,其中g(shù)為全局替換,用于替換所有出現(xiàn)的次數(shù); /如果和正則匹配的內(nèi)容沖突可以使用其他符號,如 : s@old@new@g
2、標(biāo)志位
為什么要有多行模式: 配置文件一般有單行出現(xiàn),但也有使用json或XML格式的配置文件,為多行出現(xiàn)。
多行模式處理命令N、D、P
無論是工作中使用還是應(yīng)付各種面試,linux sort 都是必須要掌握的 linux 基本命令之一。尤其是 linux sort -k 命令,經(jīng)常會被搞暈,索性好好研究一下 sort 命令
語法:
選項(xiàng):
參數(shù)就不一一介紹了,直接上例子,首先先看下原始的排序數(shù)據(jù)
cat sort.log
1、打印從哪列開始是亂序
sort -c sort.log; echo $?
sort -C sort.log; echo $?
其中,返回結(jié)果 1,表示文件不是已經(jīng)排序好的文件
2、默認(rèn)排序( 整行進(jìn)行ASCII字符升序)
sort sort.log
3、高能來了,讓人迷糊的 k 語法,首先看下 k 的語法格式
這個語法格式可以被其中的逗號(”,”)分為兩大部分,Start部分和End部分
Start和End部分都由三部分組成,其中的Modifier部分就是類似n和r的選項(xiàng)部分,可省略
FStart、Fend,表示使用的域,而CStart則表示在FStart域中從第幾個字符開始算"排序首字符",同理,CEnd表示結(jié)尾的第幾個字符是排序末尾字符,.CStart、.CEnd是可以省略的,分別表示從本域的開頭部分開始、到本域的域尾結(jié)束,CEnd設(shè)定為0,也是表示結(jié)尾到域尾??谡f無憑,上幾個例子吧
3.1 對第三列進(jìn)行排序,如果不加n,按照 ASCII字符排序
sort -t $'\t' -k 3 sort.log
3.2 加n后,按照數(shù)值排序
sort -t $'\t' -k 3n sort.log
3.3 不指定 FEnd 時,多個 -k 從前往后排序可以,從后往前不行
從后往前,多個 -k,數(shù)據(jù)符合預(yù)期
sort -t $'\t' -k 3n -k 1 sort.log
從后往前,多個 -k ,第三列相同時,按照第一列降序排列,數(shù)據(jù)符合預(yù)期
sort -t $'\t' -k 3n -k 1r sort.log
更換成從前往后
sort -t $'\t' -k 1 -k 3n sort.log
sort -t $'\t' -k 1 -k 3nr sort.log
通過 sort -t $'\t' -k 1 -k 3n sort.log 和 sort -t $'\t' -k 1 -k 3nr sort.log 返回的結(jié)果發(fā)現(xiàn),在第一列相等時,無論其三列是正序排列,還是逆序排列,結(jié)果都一樣,說明后邊的 -k 未生效
當(dāng)指定 FEend 后
sort -t $'\t' -k 1,1 -k 3nr sort.log
3.4 作用域
緊跟在字段后的選跡謹(jǐn)項(xiàng)(如"-k3n"的"n"和"-k2nr"的"n","r")稱為私有選項(xiàng),使用短橫線寫在字段外的選項(xiàng)(如"-n"、"-r")為全局選項(xiàng)。當(dāng)沒有為字段分配私有選項(xiàng)時,該排序者返字段將繼承全局選項(xiàng),所有選項(xiàng)包括但不限于"bfnrhM"
除了"b"選項(xiàng)外,其余選項(xiàng)無論是指定在FStart還是FEnd中都是等價的,對于"b"選項(xiàng),指定在FStart則作用于FStart,指定在FEnd則作用于FEnd
sort -t $'\t' -k1r,2 sort.log ,可以看出一、二列都是倒敘排列
3.5 注意
指定n選項(xiàng)按數(shù)值排序時, 由于"n"選項(xiàng)只能識別數(shù)字和負(fù)號"-",當(dāng)排序時遇到無法識別字符時,將導(dǎo)致該key的排序立即結(jié)束,n選項(xiàng)絕對不會跨域進(jìn)行比較
默認(rèn)情況下,sort會進(jìn)行一次 "最后的排序" ,按照默認(rèn)規(guī)則對整行進(jìn)行一次排序,這次排序稱為"最后的排序"
sort -t $'\t' -k3n sort.log ,在第三列相等時,整行會按照 ASCII 進(jìn)行最后的升序排列
sort -t $'\t' -k3,4n -s sort.log ,加了 -s 后,不會進(jìn)行最后的排序(1000相同時,e在b的前邊了),而是保留原排序
3.6 按照某個姿嫌基域中的第n個字符進(jìn)行排序
sort -t $'\t' -k2.3,2.3 sort.log ,按第二列第三個字符進(jìn)行排序
4、 -h 使用易讀性數(shù)字(例如:2K、1G)
sort -t $'\t' -k5h sort.log
sort -t $'\t' -k2,2 sort.log|uniq
sort -t $'\t' -k2,2 -u sort.log 會對第二列進(jìn)行去重,而 sort -t $'\t' -k2,2 sort.log|uniq 會對整行進(jìn)行去重(當(dāng)然uniq也可以按照第二列進(jìn)行去重)
sort整理完了,歡迎大牛指教
可慧緩以使用 Linux 系統(tǒng)的拷貝命令仔李 cp,對原來的文件進(jìn)行替前戚模換。例如:
$cp newfile oldfile
該命令的作用就是使用現(xiàn)在 newfile 的內(nèi)容,替換掉原來 oldfile 的內(nèi)容。
1. sed -i 's/CANCEL_TIME/CANCEL_RECV_TIME/g' csv2drds-TF_B_PAYLOG_D.json
---指定文件替換,將文件中的CANCEL_TIME替換成CANCEL_RECV_TIME;
2.?sed -i 's/CANCEL_TIME/CANCEL_RECV_TIME/g' `grep CANCEL_TIME -rl ./*TF_B_PAYLOG_D*.json`
---批量文件替換,遞歸查找含CANCEL_TIME的文件,將所有文件中的CANCEL_TIME替換成CANCEL_RECV_TIME;
3. sed -i 's/\/tmp\/ditagent\/TF_B_PAYLOG_D.csv/\/vdata\/datapre\/281\/'"$filename"'/g' $jsonname
---帶/的字符串替換,將/tmp/ditagent/TF_B_PAYLOG_D.csv替換成/vdata/datapre/281/'"$filename"'
4.?sed -i 's/^/beginstring/g' *.txt
---型攜在所有行首添加字符串;
5.??sed -i 's/$/endstring/g' *.txt
---在所有行末添加字符串
6. sed -i '2s/原字符串/替換字符串/g' *.txt
---替換第2行
7. sed -i?'$s/原字符串/替換字符串/g'?*.txt
---替換最后一行
8. sed?-i? '2,5s/原字符串/替換字符串/g'?*.txt
---替換2到5行
9. sed -i? '2,$s/原字符串/替換字符串/g'?*.txt
---替換2到最后一行
10. sed 's/\x80/|/g' test.dat |iconv -f gbk -t utf-8 testutf8.dat
---把test.dat中的歐元符號替換成豎線,再將文件gbk格式轉(zhuǎn)成utf8
-i選項(xiàng)是直接在文件中替換,不在終端輸出;
-r選項(xiàng)是所給的path中的目錄遞歸查找;
-l選項(xiàng)是輸出所猛租蘆有匹配到oldstring的文件;
s/表示替換
/枝帶g表示全局替換