awk 引用程序文本

awk 引用程序文本

我刚刚在 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 }

请使用单引号。

相关内容