如何在解析后不丢失其他 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
我有以下输出来 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