如何拆分空格不相等的字符串



我目前正在努力拆分来自日志文件的具有不同空间的字符串。

日志文件摘录:

ProcessA   Mon Nov  9 09:59 - 10:48  (00:48)            
ProcessB     Sun Nov  8 11:16 - 11:17  (00:00)          
ProcessC  Sat Nov  7 12:52 - 12:53  (00:00)             
ProcessD   Fri Nov  6 09:31 - 11:25  (01:54)            
ProcessE  Thu Nov  5 16:41 - 16:41  (00:00)             
ProcessF  Thu Nov  5 11:39 - 11:40  (00:00)

正如您所看到的,进程名称和执行日期之间的空格数量在2到5个空格之间变化。我想把它分成三部分:流程、执行日期和执行时间。

然而,由于空间的不相等,我看不到解决方案。是我错了,还是把这样一根绳子劈开非常难?

希望有人比我聪明,能为我提供解决方案😊

提前感谢所有愿意帮助我的人!

您也可以直接在read中分配字段。

while read -r prc wd mon md start _ end dur _; do
echo "prc='$prc' wd='$wd' mon='$mon' md='$md' start='$start' end='$end' dur='${dur//[)(]/}'"
done < file

输出:

prc='ProcessA' wd='Mon' mon='Nov' md='9' start='09:59' end='10:48' dur='00:48'
prc='ProcessB' wd='Sun' mon='Nov' md='8' start='11:16' end='11:17' dur='00:00'
prc='ProcessC' wd='Sat' mon='Nov' md='7' start='12:52' end='12:53' dur='00:00'
prc='ProcessD' wd='Fri' mon='Nov' md='6' start='09:31' end='11:25' dur='01:54'
prc='ProcessE' wd='Thu' mon='Nov' md='5' start='16:41' end='16:41' dur='00:00'
prc='ProcessF' wd='Thu' mon='Nov' md='5' start='11:39' end='11:40' dur='00:00'

read通常不关心中间有多少空白。

在bash中,您可以使用正则表达式来解析每一行:

#! /bin/bash
while IFS=' ' read -r line ; do
if [[ "$line" =~ ([^ ]+) +(.+[^ ]) +'('([^)]+)')' ]] ; then
process=${BASH_REMATCH[1]}
date=${BASH_REMATCH[2]}
time=${BASH_REMATCH[3]}
echo "$process $date $time."
fi
done

或者,使用参数展开:

#! /bin/bash
while IFS=' ' read -r process datetime ; do
shopt -s extglob
date=${datetime%%+( )(*}
time=${datetime#*(}
time=${time%)}
echo "$process $date $time."
done

使用awk:

awk '{printf $1; for (i=2; i<NF; i++) printf " %s",$i; print "",$NF}' < file.txt

生产:

ProcessA Mon Nov 9 09:59 - 10:48 (00:48)
ProcessB Sun Nov 8 11:16 - 11:17 (00:00)
ProcessC Sat Nov 7 12:52 - 12:53 (00:00)
ProcessD Fri Nov 6 09:31 - 11:25 (01:54)
ProcessE Thu Nov 5 16:41 - 16:41 (00:00)
ProcessF Thu Nov 5 11:39 - 11:40 (00:00)

相关内容

  • 没有找到相关文章

最新更新