Linux
在替換部分方法中使用 Sed 正則表達式擷取組
我有以下格式的時間戳文件名列表:
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
循環中獲取文件(對每個文件執行某些操作),請使用 (inbash
),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_flag
為1
找到該文件的時間。設置process_flag
為1
使循環能夠進入您實際"$pathname"
用於處理您需要執行的該文件的中間位。在繼續下一次迭代之前,最後一條
if
語句檢查目前是否$pathname
與我們要處理的最後一個文件匹配。如果是,則循環以break
語句結束。