我需要通过以下方式提取日期之间的所有文本(以下格式为:月日小时):
start_marker: "Jul 3 2"
end_marker: "Jul 3 7"
来自包含以下示例格式数据的日志文件
<unneeded text>
Fri Jul 3 2:51:54:780 2020
<needed text>
<needed text>
<needed text>
Fri Jul 3 5:51:54:780 2020
<needed text>
<needed text>
Fri Jul 3 7:51:54:780 2020
<unneeded text>
我正在尝试以下脚本,但它返回一个空白的 log_collector 文件
start_month="Jul"
start_date="3"
start_hour="2"
end_month="Jul"
end_date="3"
end_hour="7"
start_marker="$start_month $start_date $start_hour"
end_marker="$end_month $end_date $end_hour"
sed -n '/"$start_marker"/,/"$end_marker"/p' logfile >> "log_collector"
cat log_collector
最佳答案
使用 sed + 变量时使用双引号,否则 sed 不会读取您的变量,您的脚本现在将被读取/执行,因为文件已在您的示例中写入:
+ start_month=Jul
+ start_date=3
+ start_hour=2
+ end_month=Jul
+ end_date=3
+ end_hour=7
+ start_marker='Jul 3 2'
+ end_marker='Jul 3 7'
+ sed -n '/"$start_marker"/,/"$end_marker"/p' logfile
+ cat log_collector
...empty file
尝试:
sed -n "/${start_marker}/,/${end_marker}/p" logfile >> "log_collector"
结果:
+ variables...
+ sed -n '/Jul 3 2/,/Jul 3 7/p' logfile
+ cat log_collector
Fri Jul 3 2:51:54:780 2020
text...
您的脚本现在将根据需要输出变量。
但是当您使用 *_marker 表示相同的值时,我真的不明白使用 start_* 和 end_* 变量有什么意义,但也许这只是一个糟糕/令人困惑的例子:)
提示:使用“bash -x”启动脚本或添加“set -x”,您将看到脚本是如何启动的。
编辑:我在您的评论中看到 Bill Jetzer 更快,但请参阅上面的示例。
关于shell - 提取两个字符串之间的文本。这些字符串有空格,保存在变量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62724179/