从字符串中搜索键值对,仅输出匹配的记录

时间:2015-06-24 05:47:03

标签: unix sed grep keyvaluepair

根据包含键值对的字符串,我有一个大文件。我正在寻找一种正确的方法来搜索值为'apple'的值对(可以是上限或下限),如果找到则只输出相关的键值对。

对于前。 55 = APPLE

<SOH>是此处的分隔符。

 8=FIX.4.2<SOH>9=153<SOH>35=D<SOH>49=BLP<SOH>56=SCHB<SOH>34=1<SOH>50=30737<SOH>97=Y<SOH>52=20000809-20:20:50<SOH>11=90001008<SOH>1=10030003<SOH>21=2<SOH>55=APPLE<SOH>54=1<SOH>38=4000<SOH>40=2<SOH>59=0<SOH>44=30<SOH>47=I<SOH>60=20000809-18:20:32<SOH>10=061<SOH>

很高兴你能提出任何建议。

5 个答案:

答案 0 :(得分:1)

尝试使用GNU grep:

grep -ioP '>\K[^=]+=apple(?=<)' file

输出:

55=APPLE

答案 1 :(得分:1)

了解有关真实通缉信息的更多信息:

返回行数(如果没有则返回0)

<SOH>

假设:

  • APPLE是结尾分隔符
  • 您只希望~不包含 apple
  • 的字/模式

答案 2 :(得分:1)

使用one of these proper solutions将您的字符串转换为数组,以便您可以遍历所有项目。在执行此操作时,使用if字符串比较检查项目的值。

if [ "$value" = "APPLE" ]; then
     # do stuff
fi

答案 3 :(得分:1)

使用awk

awk -v RS="<SOH>" 'toupper($0)~/APPLE/' File

<SOH>设为记录分隔符。然后检查是否与APPLE匹配任何记录(使其不区分大小写,首先将转换后的记录转换为大写),如果匹配,则打印记录。

答案 4 :(得分:1)

您可以在模式中使用数字后跟=和关键字的数字:

 grep -io "[0-9]*=apple" file
  • -i, - signore-case
  • -o, - 仅匹配
  • [0-9] 0到9之间范围内的单个字符
  • 量词:*在零和无限次之间,
  • =apple匹配字符= apple字面(不区分大小写)