- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个程序可以像这样将数据打印到控制台(以空格分隔):
variable1 value1
variable2 value2
variable3 value3
varialbe4 value4
编辑:实际上输出看起来像这样:
data[variable1]: value1
pre[variable2] value2
variable3: value3
flag[variable4] value4
最后我想搜索名称的一部分,例如对于 variable2
或 variable3
但仅获取 value2
或 value3
作为输出。编辑:然后应将此单个值存储在一个变量中,以便在 bash 脚本中进行进一步处理。
我首先尝试将所有控制台输出放入一个文件并从那里处理它,例如
# value3_var="$(grep "variable3" file.log | cut -d " " -f2)"
这工作正常但太慢了。每次运行我需要处理大约 20 个这样的变量,这在我的系统上需要大约 1-2 秒。我还需要运行 ~500 次。 编辑:我实际上不需要通过一次调用自动处理所有 ~20 个“搜索”,例如哇哦。如果有一种方法可以自动执行此操作,那很好,但是 bash 脚本中的 ~20 次调用在这里也可以。
因此,我想到将控制台输出直接放入一个变量中,以消除缓慢的文件访问。但这将消除换行符,这又会使处理变得更加复杂:
# console_output=$(./programm_call)
# echo $console_output
variable1 value1 variable2 value2 variable3 value3 varialbe4 value4
编辑:它实际上看起来像这样:
# console_output=$(./programm_call)
# echo $console_output
data[variable1]: value1 pre[variable2] value2 variable3: value3 flag[variable4] value4
我找到了这种字符串排列的解决方案,但这些似乎只适用于文本文件。至少我无法在这些示例中使用存储在 $console_output
中的字符串
How to print the next word after a found pattern with grep,sed and awk?
那么,当提供(长)字符串作为变量时,如何输出找到的模式后的下一个单词?
PS:我系统上的 grep 不知道参数 -P...
最佳答案
我建议使用 awk
:
$ cat ip.txt
data[variable1]: value1
pre[variable2] value2
variable3: value3
flag[variable4] value4
$ cat var_list
variable1
variable3
$ awk 'NR==FNR{a[$1]; next}
{for(k in a) if(index($1, k)) print $2}' var_list ip.txt
value1
value3
要将另一个命令的输出用作输入文件,请使用 ./programm_call | awk '...' var_list -
其中 -
将指示 stdin
作为输入。
This single value should then be stored in a variable for further processing within the bash script.
如果您正在进行进一步的文本处理,您可以在 awk
中进行,从而避免可能较慢的 bash
循环。参见 Why is using a shell loop to process text considered bad practice?了解详情。
加速建议:
LC_ALL=C awk '..'
(请注意,正如评论中指出的那样,这并不适用于所有情况,因此您必须对其进行测试你的用例)mawk
,这通常更快。 GNU awk
在某些情况下可能仍然更快,因此您必须再次针对您的用例对其进行测试grep
程序更快。$ ./programm_call | rg -No -m1 'variable1\S*\s+(\S+)' -r '$1'
value1
$ ./programm_call | rg -No -m1 'variable3\S*\s+(\S+)' -r '$1'
value3
此处,-o
选项用于仅获取匹配的部分。 -r
用于通过将匹配部分替换为捕获组中的值来仅获取所需的文本。 -m1
选项用于在找到第一个匹配项后停止搜索输入。 -N
用于禁用行号前缀。
关于bash - 在变量的字符串中找到一种模式后输出值/词(grep、awk、sed、pearl 等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65308798/
我有一个文件 test.log。非常大的日志文件。它有不同级别的日志记录。例如,trace , debug , info , warning和 error . 显然trace级别消息只是高速发送垃圾邮
我正在经历一些事情,发现了我无法理解的事情, grep -v grep 这意味着什么?我知道 -v 开关将选择所有不匹配的行。但为什么是第二个grep? 这是完整的命令: ps -ef | grep
我使用 egrep 输出一些带有平台名称的行: XXX | egrep "i686-nptl-linux-gnu$|i686-w64-mingw32$|x86_64-unknown-linux-gnu
grep退出状态部分报告中的手册: EXIT STATUS The exit status is 0 if selected lines are found, and 1 if not
我试图返回多个字符串的第一次出现,即,我想从以下文本中选择第一次出现 1259、3009 和 1589 的行。 ADWN 1259 11:00 B23 ADWN 3009
我猜它不是 Perl 兼容的正则表达式,因为有一种特殊的 grep具体来说就是 PCRE。什么是grep最相似? grep有什么特别的怪癖吗?我需要知道什么? (我习惯了 Perl 和 PHP 中的
有没有办法让 grep 从与搜索表达式匹配的文件中输出“单词”? 如果我想在多个文件中查找“th”的所有实例,我可以这样做: grep "th" * 但是输出会是这样的(粗体是我写的); some-t
我有许多(近 100 个)大 csv 文件,第一列中有 sellID。我知道某些 sellID 在 2 个或更多文件中重复 2 次或多次。是否可以使用 grep 找到所有重复的 sellID(创建映射
我有一个文件中的文件列表。该列表很大,并且文件名是非标准的:这意味着有些文件包含空格、非 ASCII 字符、引号、单引号... 因此,将庞大的文件列表作为参数传递给 grep 并不是一种选择: 因为我
我想在 shell 脚本中使用 grep 和两个变量 var = match cat list.txt | while read word_from_list; do grep "$word_
我有一个大文件,其中每一行都包含一个子字符串,例如 ABC123。如果我执行 grep ABC file.txt 或 grep ABC1 file.txt 我按预期返回这些行,但如果我执行 grep
当我执行以下 grep 时,我得到的结果我无法向自己解释: host:/usr/local/tomcat > grep '-XX:PermSize=256m' * RELEASE-NOTES:
这个问题在这里已经有了答案: grep recursively for a specific file type on Linux (5 个回答) 关闭4年前。 要在子目录中查找所有带有 .out 扩
有什么方法可以让我在搜索某些东西时使用 grep 忽略某些文件,相当于 svnignore 或 gitignore 的东西?我通常在搜索源代码时使用类似的东西。 grep -r something *
有没有办法让 grep 从匹配搜索表达式的文件中输出“单词”? 如果我想在多个文件中找到“th”的所有实例,我可以这样做: grep "th" * 但是输出会是这样的(粗体是我的); some-tex
我是 awk/sed 的完全菜鸟,所以如果我在这里遗漏了一些明显的东西,请原谅我。 基本上我正在尝试做一个嵌套的 grep,即类似于: grep $value `exim -Mvh $(`exim -
我正在尝试编写下载 node.js source 的脚本和 corresponding SHASUMS256.txt ,校验和,grep OK,不返回任何结果,使用 grep 的 -q 标志成功退出代
在 grep "str"* 这是否意味着 grep 执行 grep 的所有内容? 那么 grep -r "str". 的结果比前一个多 最佳答案 当您运行 grep str * 时,shell 将扩展
我正在尝试 grep 文件以查找匹配项的确切出现,但我也得到了更长的虚假匹配项: grep CAT1717O99 myfile.txt -F -w 输出: CAT1717O99 CAT1717O99
我有一个文件,其中包含我希望通过未指定分析运行的标识符(每行一个)。如果一切运行正常,分析将输出具有相同标识符的另一个列表(不一定按相同顺序)。 然而,事实证明,对某些输入标识符没有进行分析,并且这些
我是一名优秀的程序员,十分优秀!