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

Search for key value pair from the string and output only the matching record

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

例如。 55=苹果

<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>

很高兴您能提供任何建议。

用 GNU grep 试试:

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

输出:

55=APPLE

没有关于真正想要的信息的更多信息:

Return 行数(如果不存在则为 0)

grep -i -E -c -e '(^|<SOH>)[^=]*=APPLE<SOH>'

假设:

  • <SOH>是结束分隔符
  • 你只想要 APPLE 而不是 word/pattern 包含 apple

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

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

awk:

awk -v RS="<SOH>" 'toupper([=10=])~/APPLE/' File

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

您可以使用字符 class 作为数字后跟模式中的 = 和关键字:

 grep -io "[0-9]*=apple" file
  • -i, --忽略大小写
  • -o, --only-matching
  • [0-9] 0 到 9 之间的单个字符
  • 量词:*介于零次和无限次之间,
  • =apple 按字面匹配字符 =apple(不区分大小写)