我刚刚在 awk 中遇到了一个问题,我想知道是否有人可以向我解释为什么会发生这种情况。
如果我运行,以下两行的行为会有所不同:
# grep -Rl BASE_DIR --exclude-dir=.svn * | awk -F "/" '{print $1}'
我(正如预期的那样)仅获得包含 BASE_DIR 的文件路径的第一个目录。
但是,如果我像这样运行它:
# grep -Rl BASE_DIR --exclude-dir=.svn * | awk -F="/" "{print $1}"
编辑:
-F="/"
并且-F "/"
对我的测试没有任何影响。第二个命令已更新以显示这一点
根据 glenn jackman 在答案中的建议,我将命令更改为:
# grep -Rl BASE_DIR --exclude-dir=.svn * | awk -F "/" "{print $1}"
并得到了完全相同的错误结果
编辑结束
我获得了包含 BASE_DIR 的文件的完整路径,我尝试转义程序文本,以防出现"{print \$1}"
此问题,但我得到了相同的结果。
有人能告诉我这里的问题是什么吗?
答案1
在第一个例子中,您正在执行以下操作:awk -F "/"
在下一个例子中,您正在执行以下操作:awk -F="/"
因此字段分隔符不同:您使用两个字符串=/
作为字段分隔符
啊,我不知道为什么我以前没有看到这个:你使用了错误的引号:
# grep -Rl BASE_DIR --exclude-dir=.svn * | awk -F "/" "{print $1}"
------------------------------------------------------^
awk 程序周围的双引号表示 shell 将替换变量$1
前将程序交给 awk。在 shell 中,很可能$1
是空的,因此 awk 看到以下内容:{print }
请使用单引号。