警告 - 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循环方法。
希望这很清楚。
由于 布赖恩
答案 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动作?