如何在解析后不丢失其他 columns/rows 的内容的情况下解析特定的列或数据?

How to parse a specific column or data without losing content from other columns/rows after parsing?

我有以下输出来 grep 本例中的值“225”。该值实际上是一个变量 $pd,因此它可能会根据用户输入而变化“它可以是整数或不区分大小写的字母数字字符完全匹配。例如,如果变量的值为“225”,则为“0225”或“11225”它不是我正在阅读的文件的有效输出。

Input File:
10.20.223.10|2000-H1|1/1/2|DeviceX_4021|LG
10.20.223.10|2000-H1|1/1/3|Undiscoverable|Unkwn
10.20.225.10|2000-H1|1/1/5|DeviceZ_2050|LG
10.20.223.10|2000-H1|1/1/8|DeviceY_225_|Kenmore
10.20.223.10|2000-H1|1/1/8|DeviceY_01225_|Kenmore
10.20.225.10|2000-H1|1/1/8|DeviceY_2250_|Kenmore

Desired Output File:
10.20.223.10|2000-H1|1/1/8|DeviceY_225_|Kenmore

If user input is "lg"; then it should output the line without not ignoring it because the input file has "lg" in uppercase. (This part is already fixed on the script).

Desired Output:
10.20.223.10|2000-H1|1/1/2|DeviceX_4021|LG
10.20.225.10|2000-H1|1/1/5|DeviceZ_2050|LG

几乎肯定还有一个 awk 解决方案,但在 Perl 中是这样的:

$ perl -aF'\|' -ne '$F[3] =~ 225 and print' < input
10.20.223.10|2000-H1|1/1/8|DeviceY_225_|Kenmore
  • -a:将输入自动拆分为数组 @F
  • -F'\|:设置自动分割分隔符为|
  • -n: 运行 输入文件中每一行的代码
  • -e:这是 运行
  • 的代码
  • $F[3]:自动拆分数组的第4个元素@F
  • =~:正则表达式匹配
  • and print:如果正则表达式匹配
  • ,则打印输入行

更新: 您可以通过在 BEGIN 块中分配它来从命令行参数中获取您感兴趣的字符串。

$ perl -aF'\|' -ne 'BEGIN { $x = shift } $F[3] =~ $x and print' 225 < input

使用sed

sed -n '/^\([^|]*\|\)\{3\}[^|]*225/p' < input

解释:

  • -n 选项在每个 sed 循环结束时禁用自动输出
  • 该模式通过 \(parenthesized\) 模式匹配前三 (\{3\}) 列数据的任意内容 [^|]*\| -- 任意数量的非定界符后跟列定界符
  • 它匹配第四列开头的附加输入,但不跨列,具有类似的子表达式:[^|]*
  • 然后是你要匹配的文字
  • 模式后的 p 命令导致该行在与模式匹配的情况下被打印到 sed 的输出中
$ awk -F'|' -v n='225' ' ~ n' file
10.20.223.10|2000-H1|1/1/8|DeviceY_225_|Kenmore

或者如果您不想要部分匹配(例如针对 1225),那么一种方法是:

$ awk -F'|' -v n='225' ' ~ ("(^|[^0-9])" n "([^0-9]|$)")' file
10.20.223.10|2000-H1|1/1/8|DeviceY_225_|Kenmore

或:

$ awk -F'|' -v n='225' ' ~ ("(^|_)" n "(_|$)")' file
10.20.223.10|2000-H1|1/1/8|DeviceY_225_|Kenmore

还有其他的可能性。正确的解决方案取决于您尚未告诉我们的要求,并且在使用您尚未向我们展示的其他输入时会通过或失败。

awk

awk -F"|" -v var="[A-Za-z].225_" ' ~ var{print}'

sed

sed -n '/[A-Za-z].225./p'

grep

grep '[A-Za-z].225.'

输出

10.20.223.10|2000-H1|1/1/8|DeviceY_225_|Kenmore