问题:
我正在尝试在文件中搜索字符串,并且仅在匹配字符串的所有出现位置的上方仅显示第一行,而在匹配行下方仅打印第二行。有没有办法可以用PHP脚本实现这一目标? (将使用输出更新网页)无法通过外壳grep / awk找到解决方案,而我无法使用。
文件内容:
"timeUpdated":1533998971008
"name":"ABC"
"uptime":5143980267
"desiredStatus":"STARTED"
"lastReportedStatus":"STARTED"
"started":true
"serverArtifacts":[{"id":73
"timeUpdated":1525213888405
"name":"XYZ"
"uptime":6746828144F
"desiredStatus":"STARTED"
"lastReportedStatus":"STARTED"
"started":true
"serverArtifacts":[{"id":21
"timeUpdated":1544131291380
"name":"KLM"
"uptime":6746828643
"desiredStatus":"STARTED"
"lastReportedStatus":"STARTED"
"started":true "serverArtifacts":[{"id":303
search for string: uptime -> print first line above (name:) and second line blow (lastReportedStatus:)
note: I can only use "uptime" as a search string since all other value pairs occur multiple times in a different sequence on other parts of the file.
expected output:
"name":"ABC"
"lastReportedStatus":"STARTED"
"name":"XYZ"
"lastReportedStatus":"STARTED"
"name":"KLM"
"lastReportedStatus":"STARTED"
答案 0 :(得分:0)
如果将文件中的行读入数组:
$lines = file('file.txt', FILE_IGNORE_NEW_LINES);
然后,您可以在遍历数组时跟踪键,并通过对键进行简单的加/减来找到与“正常运行时间”相对的行。
foreach ($lines as $key => $line) {
if (substr(trim($line),0, 8) == '"uptime"') {
$result[] = $lines[$key - 1];
$result[] = $lines[$key + 2] ?? '';
}
}
如果文件的每一行之间确实存在空白行,则可能需要向FILE_SKIP_EMPTY_LINES
添加file()
选项。我不确定这里的问题是否就是这样。
不过,我很好奇文件数据的来源。它与JSON非常接近,如果有任何方法可以从源头上获取其余信息,那么我们在这里就不必用这种笨拙的方式来处理它了。该代码将适用于您显示的示例,但这并不理想。