記使用sed的一次坑

2022-04-03 10:29:18 字數 1104 閱讀 7954

sed做為linux下的三劍客,自然功能強大,但是如果使用不當,反而適得其反,今天就因為這個命令採了很深坑,分析一下原因,以諫後來者。

情景回顧:

專案中使用的乙個python爬蟲採用的是多執行緒併發爬取,輸入為乙個存放url的檔案,因為程式隨時可能停止,所以每次重啟程式的時候需要將以爬取過的url去除,實現思路如下:

但是這樣實現自動化的時候多有不便,乙個程式就涉及五個檔案,在加上其他的邏輯,檔案眾多,用shell指令碼實現自動化寫出來的**可讀性差,不易理解,所以想重新更改一下策略。有一種思路就是在程式啟動的時候將文字讀入乙個list,然後刪除掉處理完成的,程式關閉時將list寫入檔案,這樣看似輕鬆,但是文字內容過大,而且如果程式異常退出,就會丟失掉記憶體中list內容,幹了半天白幹了。

旁邊的乙個小哥給了個建議,說是處理完就直接從input中刪掉,這樣就不用再寫shell自動化了,程式重啟直接讀取input檔案就ok了。

但是如何用python實現刪除檔案中指定的一行吶?總不能把檔案讀成列表,然後把那一行刪除,然後再寫回檔案。因為是個大檔案,這樣效率很低。尤其是在多執行緒併發的情況下這樣會導致大量io,旁邊的小哥又獻策說可以用os.system('sed -i 1001d %s' % filename) 系統呼叫sed刪除該行,在無可奈何的情況下,一想這樣編碼也不是很簡單嗎? 於是就欣然接收了這個提議,很快就實現了。

程式執行起來後才發現不是自己想的那樣,自己還是沒有搞明白sed,

原理剖析:

使用-i選項可以直接在原檔案進行修改,他會將sed原本輸出到螢幕的內容輸出到乙個以sed開頭的臨時檔案,處理完畢後他會將這個臨時檔案替換原本的檔案,如果執行的時候出現錯誤,這個臨時檔案就不會被刪除,一直留在那裡。

而且在多個執行緒同時呼叫sed的時候,就會出現以下情況

sed固然強大,但是應該在直到其實現原理的情況下合理呼叫,避免在多執行緒情況下呼叫。

記hibernate一次坑

在使用hibernate反轉工程時有乙個坑放在這裡,避免大家跳進去。本人用的是myeclipse2017ci,在使用hibernate反轉工程生成原始dao方法時碰到的bug。在方法public account findbyid long id 中有一段 及其坑爹 log.debug getting...

記一次使用Cobar踩到的坑

起因是因為日誌裡經常報出鎖等待超時的錯誤,並且這個是環環相扣的,乙個鎖等待會直接引發另外的鎖等待,所以危害非常嚴重,影響非常深遠。尋找原因發現是c3p0報出了deadlock,如下圖所示 可以看出來scatteredacquiretask,也就是獲取連線的任務,全部卡在那不動了。那顯然是無法獲取新的...

記Ansible的一次坑

兩台虛擬機器 a 主機名為ansible b 主機名為web 當a執行ansible web m shell a echo 時 結果為ansible,當執行ansible web m shell a echo 結果卻為ansible只是換了個引號結果卻不相同。這是因為ansible的工作過程如下 書...