Linux

在替換部分方法中使用 Sed 正則表達式擷取組

  • February 15, 2019

我有以下格式的時間戳文件名列表:

cat files
  • .. 201807010112 .log
  • .. 201807020112 .log
  • .. 201807022359 .log
  • .. 201807030112 .log
  • .. 201807010412 .log

我需要獲得一定的範圍,為了做到這一點,我想使用 SED。

sed -n '/201807010112/,/201807030112/p' 

這是我的第一次嘗試,但 sed 奇怪地對待小時和分鐘,長話短說它無法正確理解這種格式。

我可能會陷入困境,但為了解決這個問題,我決定將格式轉換為 SED 可以理解的格式。

cat files | sed -e "s/\([0-9]\{12\}\}/$(date -f '%Y%m%d%H%M' \1)/g"

我的問題是我不能在日期轉換塊中使用匹配*\1的結果。*

有沒有辦法做到這一點或更好但更好的方法來獲取日期範圍?

您的問題表明您需要在某個日期範圍內獲取某些日誌文件的名稱。

讓我們忽略您在文本文件中擁有文件名這一事實,而是假設您可以直接訪問某個目錄中的文件$logdir

文件名的格式是*_YYYYMMDDhhmmss.log結束位是標準時間戳字元串。

要在循環之間*_201807010112.log*_201807030112.log循環中獲取文件(對每個文件執行某些操作),請使用 (in bash),

process_flag=0

for pathname in "$logdir"/*_??????????????.log
do
   if [ "$process_flag" -eq 0 ]; then
       if [[ "$pathname" == *_201807010112.log ]]; then
           process_flag=1
       else
           continue
       fi
   fi


   # Do some sort of processing of
   # the logfile in "$pathname" here.


   # When done...

   if [[ "$pathname" == *_201807030112.log ]]; then
       break
   fi
done

此循環循環遍歷具有相似文件名格式的*所有日誌文件。*該循環將按字典順序遍歷路徑名。假設所有文件都具有相同的文件名前綴(您對此一無所知)。

循環的第一部分檢測範圍內的第一個文件並設置process_flag1找到該文件的時間。設置process_flag1使循環能夠進入您實際"$pathname"用於處理您需要執行的該文件的中間位。

在繼續下一次迭代之前,最後一條if語句檢查目前是否$pathname與我們要處理的最後一個文件匹配。如果是,則循環以break語句結束。

引用自:https://unix.stackexchange.com/questions/460912