新聞中心
Linux神器:使用SED過濾時(shí)間輕松搞定!

目前創(chuàng)新互聯(lián)公司已為1000多家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間、綿陽服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計(jì)、鳳陽網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
在日常工作中,我們往往需要處理大量的文本數(shù)據(jù)。其中,日期和時(shí)間這類數(shù)據(jù)占據(jù)了相當(dāng)重要的比例,比如日志文件中的時(shí)間戳、數(shù)據(jù)處理中的日期篩選、數(shù)據(jù)匹配中的時(shí)間范圍過濾等等。但是由于數(shù)據(jù)量巨大,手動(dòng)篩選和處理時(shí)常會(huì)引發(fā)疲勞和錯(cuò)誤,于是如何快捷高效地以文本處理方式搜索和提取其中的日期和時(shí)間成為了一項(xiàng)需求。
Linux操作系統(tǒng)的強(qiáng)大和靈活性使得其成為了一個(gè)非常適合進(jìn)行文本處理的平臺(tái),其中SED是不可或缺的一個(gè)工具。SED是一種簡單但是功能非常強(qiáng)大的流編輯器,它的作用是根據(jù)一定的規(guī)則對指定的文本進(jìn)行處理和編輯。在文本處理種類繁多、需求不一的情況下,SED可以根據(jù)用戶的需要來制定相應(yīng)的規(guī)則,高效地完成文本處理和數(shù)據(jù)提取的任務(wù),從而極大地提高了工作效率。
在本文中,我們將探討如何使用SED過濾時(shí)間,介紹SED的基礎(chǔ)知識和具體操作步驟,以及介紹一些常用的SED規(guī)則和應(yīng)用案例。希望本文能夠?yàn)樽x者提供一些有用的提示和指南,幫助大家在日常工作中更加高效地完成文本處理任務(wù)。
一、SED基礎(chǔ)知識
SED是一款常用的行編輯器,主要用于對文本中的行進(jìn)行編輯和替換。它支持正則表達(dá)式的搜索和替換,可以靈活地處理大量的文本數(shù)據(jù)。當(dāng)然在sed處理過程中,我們對正則表達(dá)式的理解也是至關(guān)重要的。以下是一些在sed中經(jīng)常用到的正則表達(dá)式符號說明:
1. ^:匹配行的開始位置
2. $:匹配行的結(jié)束位置
3. .:匹配除了換行符之外的任意一個(gè)字符
4. *: 匹配零個(gè)或多個(gè)在它之前的字符
5. []:匹配其中的任何一個(gè)字符
6. \:轉(zhuǎn)義符號,用于表示正則表達(dá)式中的特殊字符
以上的這些符號都是sed中常用的正則表達(dá)式符號,掌握了它們之后我們就可以開始使用sed命令進(jìn)行文本處理了。
二、SED過濾時(shí)間
1. 過濾指定日期的文本
假設(shè)我們有一個(gè)文本文件file.txt,其中包含了多行數(shù)據(jù),每行數(shù)據(jù)的格式為“日期 加減時(shí)間點(diǎn)”,例如“20230101 120230”,我們希望提取所有2023年1月1日的數(shù)據(jù)。這時(shí)候我們可以使用sed命令中的正則表達(dá)式進(jìn)行匹配。具體來說,可以使用“^20230101”來匹配日期為2023年1月1日的數(shù)據(jù),使用“sed -n ‘/^20230101/p’ file.txt”即可。
2. 過濾某個(gè)時(shí)間點(diǎn)的文本
如果我們只需要提取文本中指定的時(shí)間點(diǎn)的數(shù)據(jù),我們可以使用sed命令結(jié)合正則表達(dá)式進(jìn)行匹配。例如我們需要提取出所有下午1點(diǎn)的數(shù)據(jù),可以使用“p.m. 01”進(jìn)行匹配,然后使用“sed -n ‘/p\.m\. 01/p’ file.txt”即可。
3. 過濾指定時(shí)間范圍內(nèi)的文本
有時(shí)候我們需要根據(jù)時(shí)間范圍來提取文本數(shù)據(jù)。例如我們需要提取文件file.txt中20230101到20231231之間的所有數(shù)據(jù),可以使用“sed -n ‘/^20230101/,/^20231231/p’ file.txt”命令對文本數(shù)據(jù)進(jìn)行提取。
4. 時(shí)間格式轉(zhuǎn)換
在日常工作中,我們不僅需要提取時(shí)間數(shù)據(jù),還可能需要對提取到的時(shí)間數(shù)據(jù)進(jìn)行格式轉(zhuǎn)換。比如我們提取到了“20230101 120230”這樣的數(shù)據(jù),如果需要將其轉(zhuǎn)換為2023-01-01 12:00:00這樣的格式,可以使用sed命令結(jié)合正則表達(dá)式進(jìn)行替換。例如“sed ‘s/\(….\)\(..\)\(..\) \(..\)\(..\)\(..\)/\1-\2-\3 \4:\5:\6/’ file.txt”就可以完成上述任務(wù)。
SED提供了一種強(qiáng)大的文本處理工具,尤其在處理時(shí)間數(shù)據(jù)上具有很高的實(shí)用價(jià)值。它能夠幫助我們快速高效地處理文本數(shù)據(jù),提取需要的信息,為我們的工作帶來極大的便利。當(dāng)然,要熟練掌握SED也需要我們不斷的學(xué)習(xí)和實(shí)踐,只有在實(shí)踐中不斷試錯(cuò),才能讓我們的文本處理技巧更加?jì)故斓貞?yīng)用于我們的實(shí)際工作中。
相關(guān)問題拓展閱讀:
- linux shell sed命令用法
- Linux sed命令使用!
linux shell sed命令用法
s/::RE::/::DT::/::OPTION::
是這個(gè)語法…
sed替換命令的結(jié)構(gòu)為: s/A/B/
你在最后少了個(gè)斜杠/,結(jié)吵沖差構(gòu)不完整判納,會(huì)報(bào)升皮錯(cuò)。
修改為:
A=hello
ar=$(date “+%Y%m%d”)
echo A | sed “s/he/$Var/”
我注意到你結(jié)尾脊灶兄忘寫櫻襲斜杠了。
echo $A | sed 辯答”s/he/$Var/”
$ echo $A | sed “s/he/$Var/游握孫”
llo
幫你試過了神鏈皮孝
linux之sed用法
sed是一個(gè)很好的文件處理工具,本身是一個(gè)管道命令,主要是以行為單位進(jìn)行處理,可以將數(shù)據(jù)行進(jìn)行替換、刪除、新增、選取等特定工作。
sed命令行格式為:
sed ‘command’ 輸入文本
常用選項(xiàng):
n∶使用安靜(silent)模式。在一般 sed 的用法中,所有來自 STDIN的資料一般都會(huì)被列出到螢?zāi)簧?。但如果加?-n 參數(shù)后,則只有經(jīng)過sed 特殊處理的那一行(或者動(dòng)作)才會(huì)被列出來。
e∶直接在指令列模式上進(jìn)行 sed 的動(dòng)作編輯;
f∶直接將 sed 的動(dòng)作寫在一個(gè)檔案內(nèi), -f filename 則可以執(zhí)行 filename 內(nèi)的sed 動(dòng)作;
r∶sed 的動(dòng)作支援的是延伸型耐嫌正規(guī)表示法的語法。(預(yù)設(shè)是基礎(chǔ)正規(guī)表示法語法)
i∶直接修改讀取的檔案內(nèi)容,而不是由螢?zāi)惠敵觥?/p>
常用命令:
a ∶新增, a 的后面可以接字串,而這些字串會(huì)在新的一行出現(xiàn)(目前的下一行)~
c ∶取代, c 的后面昌歷手可以接字串,這些字串可以取代 n1,n2 之間的行!
d ∶刪除,因?yàn)槭莿h除啊,所以 d 后面通常不接任何咚咚;
i ∶插入, i 的后面可以接字串,而這些字串會(huì)在新的一行出現(xiàn)(目前的上一行);
p ∶列印,亦即將某個(gè)選擇的資料印出。通常 p 會(huì)與參數(shù) sed -n 一起運(yùn)作~
s ∶取代,可以直接進(jìn)行取代的工作哩!通常這個(gè) s 的動(dòng)作可以搭配正規(guī)表示法!例如 1,20s/old/new/g 就是。
舉例:(假設(shè)我們有一文件名為ab)
刪除某行
# sed ‘1d’ ab#刪除之一行
# sed ‘$d’ ab#刪除最后一行
# sed ‘1,2d’ ab#刪除之一行到第二行
# sed ‘2,$d’ ab#刪除第二行到最后一行
顯示某行
. # sed -n ‘1p’ ab#顯示之一行
# sed -n ‘$p’ ab#顯示最后一行
# sed -n ‘1,2p’ ab#顯示之一行到第二行
# sed -n ‘2,$p’ ab#顯示第二行到最后一行
使用模式進(jìn)行查詢
# sed -n ‘/ruby/p’ ab #查詢爛悄包括關(guān)鍵字ruby所在所有行
# sed -n ‘/\$/p’ ab#查詢包括關(guān)鍵字$所在所有行,使用反斜線\屏蔽特殊含義
增加一行或多行字符串
# cat ab
Hello!
ruby is me,welcome to my blog.
end
# sed ‘1a drink tea’ ab #之一行后增加字符串”drink tea”
Hello!
drink tea
ruby is me,welcome to my blog.
end
# sed ‘1,3a drink tea’ ab #之一行到第三行后增加字符串”drink tea”
Hello!
drink tea
ruby is me,welcome to my blog.
drink tea
end
drink tea
# sed ‘1a drink tea\nor coffee’ ab #之一行后增加多行,使用換行符\n
Hello!
drink tea
or coffee
ruby is me,welcome to my blog.
end
代替一行或多行
# sed ‘1c Hi’ ab #之一行代替為Hi
Hi
ruby is me,welcome to my blog.
end
# sed ‘1,2c Hi’ ab#之一行到第二行代替為Hi
Hi
end
替換一行中的某部分
格式:sed ‘s/要替換的字符串/新的字符串/g’ (要替換的字符串可以用正則表達(dá)式)
# sed -n ‘/ruby/p’ ab | sed ‘s/ruby/bird/g’ #替換ruby為bird
# sed -n ‘/ruby/p’ ab | sed ‘s/ruby//g’#刪除ruby
插入
# sed -i ‘$a bye’ ab#在文件ab中最后一行直接輸入”bye”
# cat ab
Hello!
ruby is me,welcome to my blog.
end
bye
sed 命令查找與替換:
(1)刪除第2,3行:sed ‘2,3d’ test.txt > new.txt
(2)替換:
替換所有:sed ‘s/abc/ABC/’ test.txt >new.txt
查找: sed -n “/abc/p” test.txt
匹配字符串中的一部分: echo abc123 | sed ‘s/\(*\).*/\1/’
echo “ab001_ac” | sed ‘s/\(.*\)\_\(.*\)/\1,\2/’ \1表示之一個(gè)括號匹配的字符
echo “ABC01” | sed “s/*\(*\)/\1/”\1匹配后面的數(shù)字部分
echo “ab001_AC88” | sed ‘s/*\(*$\)/\1/’
echo “a001_aaST88” | sed “s/\(.*\)\(\)\(*$\)/\2/”
sed “s/^/\”&/” 32.txt 行首添加雙引號
sed “s/$/\”&/” 33.txt 行尾添加雙引號
sed “s/*$//” 35.txt 替換行尾空格
只顯示指定行范圍的文件內(nèi)容,例如:
# 只查看文件的第100行到第200行
sed -n ‘100,200p’ mysql_slow_query.log
sed -n $n”p” 22.txt 顯示某一行 n=2
sed大小寫轉(zhuǎn)換?
如何先查找,再追加所查找的行到一個(gè)新的文件:
(3)查找Tab:
sed “s/\{2,\}/\|/g”查找Tab,查找多空格,單獨(dú)一個(gè)空格的除外
awk ‘/3\t/’ 34.txt 查找\t
sed -n ‘/3>/p’ 34.txt 查找空格
sed “/\\t/p” 34.txt 查找tab
echo “\tabc\t23” | sed ‘s/>/-/’ 替換tab
sed -n ‘/>*/p’ 34.txt 查找tab
如何只替換第2個(gè)\t?
(4)
行末空格
sed ‘s/*$//g’
(5)替找空格:
echo “abc 23” | sed ‘s/\{2,\}/ /’ 把多個(gè)空格替換成一個(gè)空格
(3)
如果你想在每行的80個(gè)字符后加一個(gè)冒號,你可寫:
sed ‘s/./&:/80’ new
你也可以以蠻力解決,如下:
sed ‘s/^……………………………………………………………………../&:/’ new
(4)找一個(gè)sed命令在文件每一行加一個(gè)變量的例子:
sed ‘s/.*/&-/’ new.txt
用&作為匹配的串
有時(shí)你想查找一個(gè)模式,然后加上幾個(gè)字符,比如在匹配的串前后加上括號。如果你是找一個(gè)確定的字符串,還是比較簡單的,如下即可:
sed ‘s/abc/(abc)/’ new
如果你不是非常清楚你將找到的是串是什么,那你應(yīng)該如果來利用你找到的串做某種替換呢?
答案就是你需要一個(gè)特定的字符”&”,它即指代匹配的模式
sed ‘s/*/(&)/’ new
你可以在替換時(shí)多次使用”&”,比如,你可以次每行開頭的數(shù)字復(fù)制一次,如下:
% echo “123 abc” | sed ‘s/*/& &/’
abc
讓我再修正一下這個(gè)例子,sed會(huì)以貪婪的方式匹配之一個(gè)串。對于’*’的之一個(gè)區(qū)配是之一個(gè)字符,因?yàn)檫@個(gè)正則是匹配0個(gè)或多個(gè)數(shù)字。所以如果輸入是”abc 123”,輸出也不會(huì)改變(當(dāng)然,除了有一個(gè)空格在字母之前)。一個(gè)能保證能匹配一個(gè)數(shù)字的更好的復(fù)制數(shù)字的方法是:
% echo “123 abc” | sed ‘s/*/& &/’
abc
(5)sed 中如何使用變量(變量使用單引號包起來):
echo “abc” | sed ‘s/ab/’$v’/’
如何在文件的每一行的最前面加一個(gè)字符串和空格!
sed ‘s/^/ttt /g’ test
如何在文件的每一行的最前面加一個(gè)字符串和空格!
sed ‘s/^/ttt /g tese | sed ‘s/$/ sss\&/g’
如何在文件的每一行的最前面加一個(gè)字符串和空格!
sed ‘s/^/ttt /g tese | sed ‘s/$/ sss\&/g’
(7)匹配空行:
查找空行:sed -n “/^$/p” 20.txt
刪除空行:sed “/^$/d” 21.txt
n 不打印; sed不寫編輯行到標(biāo)準(zhǔn)輸出,缺省為打印所有行(編輯和未編輯),p命令可以用來打印編輯行
c 下一命令是編輯命令,使用多項(xiàng)編輯時(shí)加入此選項(xiàng)
f 如果正在調(diào)用sed腳本文件,使用此選項(xiàng),此選項(xiàng)通知sed一個(gè)腳本文件支持所用的sed命令,如
sed -f myscript.sed input_file 這里myscript.sed即為支持sed命令的文件
(21) 只顯示指定行范圍的文件內(nèi)容,例如:
# 只查看文件的第100行到第200行
sed -n ‘100,200p’ mysql_slow_query.log
(22)退出狀態(tài)
sed不向grep一樣,不管是否找到指定的模式,它的退出狀態(tài)都是0。只有當(dāng)命令存在語法錯(cuò)誤時(shí),sed的退出狀態(tài)才不是0。
(23)y命令
該命令與UNIX/Linux中的tr命令類似,字符按照一對一的方式從左到右進(jìn)行轉(zhuǎn)換。例如,y/abc/ABC/將把所有小寫的a轉(zhuǎn)換成A,小寫的b轉(zhuǎn)換成B,小寫的c轉(zhuǎn)換成C。
sed ‘1,20y/hrwang12/HRWANG^$/’ datafile
#將1到20行內(nèi),所有的小寫hrwang轉(zhuǎn)換成大寫,將1轉(zhuǎn)換成^,將2轉(zhuǎn)換成$。
#正則表達(dá)式元字符對y命令不起作用。與s命令的分隔符一樣,斜線可以被替換成其它的字符。
(24)% echo “123 abc” | sed ‘s/*/& &/’
abc
字符串”abc”沒有改變,因?yàn)樗鼪]有匹配正則表達(dá)式,如果你想在輸出中刪除”abc”,你必須擴(kuò)展正則表達(dá)式來匹配行的其它的部分,并顯式地用”(”,”)”和”\1”來指名,這就是下節(jié)的內(nèi)容了。
用\1來指明匹配的部分
我已經(jīng)在正則表達(dá)式那一章中介紹了”(” ”)”和”\1”的用法。現(xiàn)在復(fù)習(xí)一下,被轉(zhuǎn)義的括號(即,有反斜杠在前面的括號)來記錄正則表達(dá)的某一部分?!盶1”是被記錄的之一個(gè)模式,”\2”是第二個(gè)被記錄的模式。Sed可以記錄9個(gè)模式。
如果你想保存每行的之一個(gè)單詞,并刪除行的其它部分,你可以用下面的命令:
sed ‘s/\(\*).*/\1/’
我應(yīng)該再詳細(xì)地解釋一下。正則表達(dá)式是以貪婪的方式匹配。”*”匹配0個(gè)或多個(gè)小寫字母,它會(huì)盡量匹配更多的小寫字母?!?*”會(huì)在之一個(gè)匹配后匹配0個(gè)或多個(gè)字符。因?yàn)橹粋€(gè)模式已經(jīng)匹配了所有的小寫字母,第二個(gè)模式會(huì)匹配剩下的字符,所以你使用命令:
echo abcd123 | sed ‘s/\(*\).*/\1/’
會(huì)輸出”abcd”,而刪除后面的數(shù)字。
如果你想調(diào)換兩個(gè)單詞的位置,你可記錄兩個(gè)模式,并改變它們的次序。
sed ‘s/\(*\) \(*\)/\2 \1/’
注意兩個(gè)模式中間是有空格的。這個(gè)可保證找到兩個(gè)單詞。但是*這種模式會(huì)匹配0個(gè)字母,如果你想至少匹配一個(gè)字母,你可以用下面的命令:
sed ‘s/\(*\) \(*\)/\2 \1/’
“\1”并不需要一定出現(xiàn)在替換串中(右部),它你也可以在查找的模式中(左部)。如果你想刪除重復(fù)的單詞,你可以用:
sed ‘s/\(*\) \1/\1/’
Linux sed命令使用!
# sed
選項(xiàng)與參數(shù):
-n :使用安靜(silent)模式。在一般 sed 的用法中,所有來自 STDIN 的數(shù)據(jù)一般都會(huì)被列出到終端上。但如果加上 -n 參數(shù)后,則只有經(jīng)過sed 特殊處理的那一行(或者動(dòng)作)才會(huì)被列出來。
-e :直接在命令列模式上進(jìn)碼轎行 sed 的動(dòng)作編輯;
-f :直接將 sed 的動(dòng)作寫在一個(gè)文件內(nèi), -f filename 則可以運(yùn)行 filename 內(nèi)的 sed 動(dòng)作;
-r :sed 的動(dòng)作支持的是延伸型正規(guī)表示法的語法。(默認(rèn)是基礎(chǔ)正規(guī)表示法語法)
-i :直接修改讀森激取的文件內(nèi)容,而不是輸出到終端。
動(dòng)作說明: >function
n1, n2 :不見得會(huì)存在,一般代表『選擇進(jìn)行動(dòng)作的行數(shù)』,舉例來說,如果我的動(dòng)作是需要在 10 到 20 行之間進(jìn)行的,則『 10,20 』
function:
a :新增, a 的后面可以接字串,而這些字串會(huì)在新的一行出現(xiàn)(目前的此模襪下一行)~
linux sed過濾時(shí)間的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux sed過濾時(shí)間,Linux神器:使用SED過濾時(shí)間輕松搞定!,linux shell sed命令用法,Linux sed命令使用!的信息別忘了在本站進(jìn)行查找喔。
創(chuàng)新互聯(lián)網(wǎng)絡(luò)推廣網(wǎng)站建設(shè),網(wǎng)站設(shè)計(jì),網(wǎng)站建設(shè)公司,網(wǎng)站制作,網(wǎng)頁設(shè)計(jì),1500元定制網(wǎng)站優(yōu)化全包,先排名后付費(fèi),已為上千家服務(wù),聯(lián)系電話:13518219792
網(wǎng)頁名稱:Linux神器:使用SED過濾時(shí)間輕松搞定!(linuxsed過濾時(shí)間)
轉(zhuǎn)載來源:http://fisionsoft.com.cn/article/cddeecc.html


咨詢
建站咨詢
