shell - 提取两个字符串之间的文本。这些字符串有空格,保存在变量中

标签 shell sed

我需要通过以下方式提取日期之间的所有文本(以下格式为:月日小时):

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/

相关文章:

linux - 将命令的输出重定向到现有 tar 中的新文件

html - Linux 命令 shell : OverWriting Issue

sed - 如何用 sed 删除尾随空格?

regex - 如何使用正则表达式格式化列表

linux - 使用 find 和 sed 将文件名插入文件

regex - 如何更改文本文件 linux/unix 中的日期格式

linux - 使用命名管道将一个 shell 脚本的输出作为另一个输入

shell - Spark 作业继续运行

linux - 在 Shell 中,如何对作为字符串一部分的数字进行算术运算?

shell - 在 bourne shell 中从文件中的指定行号删除行