![使用“:”作为字段分隔符将 grep 结果通过管道传输到 awk](https://linux22.com/image/688857/%E4%BD%BF%E7%94%A8%E2%80%9C%3A%E2%80%9D%E4%BD%9C%E4%B8%BA%E5%AD%97%E6%AE%B5%E5%88%86%E9%9A%94%E7%AC%A6%E5%B0%86%20grep%20%E7%BB%93%E6%9E%9C%E9%80%9A%E8%BF%87%E7%AE%A1%E9%81%93%E4%BC%A0%E8%BE%93%E5%88%B0%20awk.png)
我想过滤 grep 命令的结果,例如:
myRepo/path/to/my/file.php:123: error_log(' - myError');
如果我执行以下操作,它就会有效。
回显“ myRepo/path/to/my/file.php:123: error_log(' - myError');” | awk -F': ' '{print $1}'
但是当它是 grep 命令的结果时,它会输出整行,为什么?
grep -rn “myError”| awk -F':' '{print $1}'
我有 CentOS 6,带有 Awk 3.1.7、bash 4.1.2
答案1
您的 awk 分隔符是 : 和空格,但我猜测您的代码使用制表符进行缩进(因此不仅在空格上匹配)。
您可以尝试将 grep 更改为以下内容(这会导致 awk 匹配 : 和制表符)。
grep -rn "myError"|awk -F':\t' '{ print $1 }'
这对我使用 slackware linux 上的 bash 4.3.46 和 awk 4.1.3 有效。
答案2
尝试这个:
grep -rn “myError” | awk -F':[ \t]*' '{print $1}'