【发布时间】:2017-05-16 19:04:58
【问题描述】:
我想逐行读取文本文件以搜索模式;当找到一行中的第一个匹配项时,将其打印到文件中并移动以搜索下一行中的模式。
由于我在 shell 方面的技能有限,我尝试了以下方法;不幸的是,当没有第一个模式时,它永远不会将no_data 打印到文件d.txt。
while read u ; do
echo "$u" | grep -o '[0-9]\{2\}/[0-9]\{2\}/[0-9]\{4\} [0-9]\{2\}:[0-9]\{2\}' |head -1 || echo "no_data"
done < tmc.txt > d.txt
注意:我尝试匹配的模式是mm/dd/yyyy hh:mm 格式的日期和时间戳。
例如,$u 可以是这样的字符串,甚至更大的字符串会包含各种垃圾:
disk0/bcdackup_20160908_115716/d/.ER/ERORR_log_msnf_20160906_113039:10641: Test Status: Failed ;Test PL (some test) was started in execution mode. 09/06/2016 14:43:28.4954 Machine:msnf (Rl888751, , ?.?, 1637) USER EVENT: TM-1102 DEFAULT -- SYSTEM ERROR: TX-0003 INIT Function Protocol Violation. Verification by TXXAxREQxConfig_destroy_config failed: 'engine_ptr != NULL' not TRUE -- SYSTEM EVENT: ER-0FFF DEFAULT (linked to IH-154B) DEACTIVATE: IH-154b DEACTIVATE: IH-154b -- SYSTEM EVENT: ER-0FFF DEFAULT (linked to IH-154C) DEACTIVATE: IH-154c DEACTIVATE: IH-154c -- SYSTEM ERROR: WP-2631 CHANGEPARAMS Error during processing of Finite State Machine Error starting perform_smooth_landing : event perform_smooth_landing not allowed in state {original_mc, actuator_system_enabled, service_off, not_homed} of state-machine WPLS.V1.2 -- SYSTEM ERROR: WP-2630 CHANGEPARAMS Error during processing of F
我可以使用任何 shell 实用程序,例如 grep、awk、sed、perl。
【问题讨论】:
-
听起来你只是想做
grep -o -E '[0-9][0-9]/[0-9][0-9]/[0-9]{4}' < tmc.txt > d.txt -
或
grep -o -E '[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}' -
啊,您的解决方案从不打印“no_data”的原因是 head 永远不会失败。在这种情况下,
head没有用,您可以将其删除。另一种常见的解决方案是在管道中的最后一个命令之后添加|grep .。 -
嗨,威廉,如果我使用您对 grep -o -E 的建议,那么对于包含多个感兴趣模式的行,它将打印多个模式
-
请记住,我只对该文件中每一行的第一个匹配项感兴趣