确保来自多个文件的grep匹配在他们自己的行上

时间:2014-03-06 22:52:04

标签: bash sed grep

警告 - bash脚本中的初学者

在bash脚本中,我正在寻找多个文件中特定行的特定数据,所以我使用grep和sed的组合以及文件数组的for循环:

示例输入:
文件1:
找到包含data1和data2的行 找到包含data1和data2的行 其他一些线路 找到包含data1和data2的行 文件2:
找到包含data1和data2的行 其他一些线路 找到包含data1和data2的行 找到包含data1和data2的行 文件3:
其他一些线路 其他一些线路 FILE4:
其他一些线路 找到包含data1和data2的行

for FILE in ${FILENAMES[@]}; do
   STRING=$STRING$( grep "find a line with data1 and data2" "$FILE" | sed -rn "s/(data1).*(data2).*/\1/p" )
done

echo "$STRING"

这个方法的问题是当for循环进入下一个文件并且grep找到一个匹配模式的行时,匹配与前一个匹配放在同一行,例如。

示例输出:

  

data1< ---- File1
  数据1
  data1data1< ---- File1和File2
  数据1
  数据1
  data1< ---- File4

     

* File3没有匹配

为了解决这个问题,我在grep / sed行末尾添加了一个“\ n”,即

for FILE in ${FILENAMES[@]}; do
   STRING=$STRING$( grep "find a line with data1 and data2" "$FILE" | sed -rn "s/(data1).*(data2).*/\1/p" )"\n"
done

echo -e "$STRING"

这解决了同一行上2个匹配项的问题,但现在在文件中找不到匹配项或在最后一次匹配后添加空行,例如

示例输出:

  

data1< ---- File1
  数据1
  数据1
  data1< ---- File1
  data1< ---- File2
  数据1
  数据1
               < ---- File3
  data1< ---- File4
             < ----没有更多匹配脚本完成。

     

* File3没有匹配

有没有一种方法可以不使用“\ n”,但仍然确保所有文件中的每个匹配都在他们自己的行中,或者我只是采用了错误的for循环方法。

希望这很清楚。

由于 布赖恩

2 个答案:

答案 0 :(得分:2)

如何(使用你的解析方法):

STRING=$(
  for FILE in "${FILENAMES[@]}"; do
    grep "find a line with data1 and data2" "$FILE" | sed -rn "s/(data1).*(data2).*/\1/p"
  done
)

或者如果文件不是太多:

STRING=$(grep -h "find a line with data1 and data2" "${FILENAMES[@]}" | sed -rn "s/(data1).*(data2).*/\1/p")

==&GT;鉴于你的脚本,我假设<---- File1,这不是输出格式的一部分..

答案 1 :(得分:0)

STRING="`sed -rn 's/(data1).*(data2).*/\1/p' ${FILENAMES[@]}`"

echo "$STRING"

为什么要进行循环,直接将所有文件都带到sed动作?