如何让GNU parallel与grep协同处理数据?
解决GNU Parallel与Grep协同问题及非简单数据传递方案
问题场景
尝试用GNU Parallel配合grep提取字符串SDSDdsds中的字符s时,所有直接组合的命令均报错,原命令及错误如下:
admin@admin:~$ grep -F -o 's' <<< "SDSDdsds" s s admin@admin:~$ echo "SDSDdsds" | grep -F 's' s s admin@admin:~$ parallel grep -F -o 's' <<< "SDSDdsds" grep: SDSDdsds: No such file or directory admin@admin:~$ parallel grep -F -o 's' ::: "SDSDdsds" grep: SDSDdsds: No such file or directory admin@admin:~$ parallel grep -F -o 's' <<< ::: "SDSDdsds" grep: SDSDdsds: No such file or directory grep: :::: No such file or directory admin@admin:~$ echo "SDSDdsds" | parallel grep -F -o 's' grep: SDSDdsds: No such file or directory admin@admin:~$ parallel echo "SDSDdsds" | grep -F -o 's' parallel: Warning: Input is read from the terminal. You are either an expert parallel: Warning: (in which case: YOU ARE AWESOME!) or maybe you forgot parallel: Warning: ::: or :::: or -a or to pipe data into parallel. If so parallel: Warning: consider going through the tutorial: man parallel_tutorial parallel: Warning: Press CTRL-D to exit.
错误原因
GNU Parallel默认会将:::后传递的内容作为命令的参数(此处即grep的文件名),而非输入文本。所以之前的命令相当于让grep去读取名为SDSDdsds的文件,自然会报错找不到文件。
正确协同命令
要让grep处理字符串内容而非文件名,需将字符串作为grep的标准输入传递,以下是几种可行方式:
方式1:用echo传递输入给grep
parallel 'echo "{}" | grep -F -o "s"' ::: "SDSDdsds"
方式2:用Here String给grep传输入
parallel 'grep -F -o "s" <<< "{}"' ::: "SDSDdsds"
方式3:批量处理多个字符串
如果要处理多个目标字符串,直接在:::后追加即可:
parallel 'grep -F -o "s" <<< "{}"' ::: "SDSDdsds" "abcSssDEF" "xyzS123"
非简单类型数据传递方案
1. 传递多行文本
用引号包裹多行内容,或结合echo -e解析转义字符:
# 直接传递带换行的字符串 parallel 'grep -F "second" <<< "{}"' ::: "first line\nsecond line\nthird line" # 先存入变量再传递 multi_line_data="line1\nline2\nline3" parallel 'grep -F "line2" <<< "$(echo -e {})"' ::: "$multi_line_data"
2. 传递结构化数据(如JSON)
直接用单引号包裹结构化数据,避免shell解析,后续可配合jq等工具处理:
parallel 'echo "{}" | jq ".name"' ::: '{"name": "Alice", "age": 30}' '{"name": "Bob", "age": 25}'
3. 从文件读取大量数据
如果数据量较大,用-a参数指定文件,每行作为一个输入项:
# 假设data.txt每行存一个待处理的字符串/数据项 parallel 'grep -F -o "s" <<< "{}"' -a data.txt
4. 处理流式输入
如果数据来自管道流,用--pipe让Parallel分块处理:
# 处理大文件的流式输入 cat large_text_file.txt | parallel --pipe grep -F -o "s"
内容的提问来源于stack exchange,提问作者CuriousPanda
相关产品推荐
相关产品推荐

