我想逐行讀取文本文件以搜索模式;當找到一行中的第一個匹配項時,將其打印到文件並移動到下一行中搜索該模式。逐行讀取文件並在每行中打印第一個匹配或沒有匹配時打印「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 .'。 –