在BASH别名或函数中使用awk

32

我在命令行上运行的命令很正常,但是当我试图将它放在别名或函数中时,它就不起作用了。

$ awk '{print $1}' /tmp/textfile
0

没错,因为在"textfile"中,'0'位于位置1。

$ alias a="awk '{print $1}' /tmp/textfile"
$ a
1 0 136 94

这是在“textfile”中的整行内容。我尝试了各种可能可行的引号、括号和反引号,但仍然遇到了相同的问题。我在很多不同格式的情况下都会遇到这个问题。

我没有理解到什么?

2个回答

69

你需要这样转义 $ 符号:

 alias a="awk '{print \$1}' /tmp/textfile"

否则您的别名为:

 awk '{print }' /tmp/textfile

这将打印整个文件...


7
这些地方表达感谢的惯例是将答案标记为正确答案(通过点击左侧的小复选框)。 =) - Costa
3
如果我是这个问题的所有者,我会很高兴地将这个答案标记为正确答案。它解决了我之前遇到的一个类似的问题。+1 - K4GDW

18

使用函数而不是别名

myfunc(){ awk '{print $1}' file; }

2
这肯定是更灵活的解决方案,因为它允许引用参数向量。例如,如果您想使用"${1:-hardcoded_filename}"来允许传递一个可选的文件名和一个明确的默认值,那么在这里将起作用,但在别名方法中不起作用。 - Charles Duffy
1
我认为使用“awk”而不是“alias”是最好的方法,因为当您需要使用多个“或'时,使用别名会变得复杂... 例如:

不起作用....

alias gethaweblist='docker exec haproxy01 cat /usr/local/etc/haproxy/haproxy.cfg | grep acl | awk '{print $2 " --> " $7}'' #正确的方式 gethaweblist(){ docker exec haproxy01 cat /usr/local/etc/haproxy/haproxy.cfg | grep acl | awk '{print $2 " --> " $7}'; }
- gavraham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接