我想逐行读取文本文件以搜索模式;当找到一行中的第一个匹配项时,将其打印到文件并移动到下一行中搜索该模式。逐行读取文件并在每行中打印第一个匹配或没有匹配时打印“no_data”
随着我有限的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”,这个头永远不会失败。在这种情况下,“头”无用,你可以将其删除。另一个常见的解决方案是在管道中的最后一个命令之后添加'| grep .'。 –