2012-10-13 65 views
0

亲爱的!我发现一个ipython的问题。ipython的作品与awk错误吗?

当我输入

!ls -l | awk '{print $$1}' 

它给我:

drwxr-xr-x 2 ckivip ckivip 4096 Oct 11 20:38 Desktop 

drwxr-xr-x 6 ckivip ckivip 4096 Oct 11 22:57 Documents 

drwxrwxr-x 3 ckivip ckivip 4096 Oct 11 12:53 Downloads 

drwxr-xr-x 6 ckivip ckivip 4096 Sep 29 18:22 Epigenetics 

drwxr-xr-x 2 ckivip ckivip 4096 Sep 20 14:59 Music 

drwxr-xr-x 23 ckivip ckivip 4096 Oct 10 11:02 Pictures 

drwxr-xr-x 8 ckivip ckivip 4096 Sep 20 15:21 Project 

drwx------ 5 ckivip ckivip 4096 Sep 25 21:31 R 

drwxr-xr-x 5 ckivip ckivip 4096 Oct 9 19:23 Share 

然而,当我输入

!ls -l | awk '{print $1}' 

它给我:

drwxr-xr-x 

drwxr-xr-x 

drwxrwxr-x 

drwxr-xr-x 

drwxr-xr-x 

drwxr-xr-x 

drwxr-xr-x 

drwx------ 

“$”符号很烦人。而最丑陋的是,当我使用'awk'函数时,我也无法使用'$'将python中的变量传输到shell。我该如何处理它?

+0

IPython允许您使用'$ var'将Python变量放入命令中,因此如果要将'$'文字传递给命令,则必须将其加倍。你也可以使用'{var}',它可能在更多情况下工作。 –

+0

在第一种情况下,我使用双'$'。但是,它给了我一个错误的答案。在第二种情况下,我只使用一个'$'。它给了我正确的答案。为什么? @Thomas K – xiuxing

+0

哦,因为整个位都在{}括号内(并且它不是一个有效的Python表达式),它会按原样传递。所以你不需要把它加倍。 –

回答

0

我对ipython并不熟悉,但是解决了将shell变量的值传递给awk的部分:用'awk -v variable = value'来实现,所以如果你有一个shell变量“$ 1”包含值“3”和你想要awk的基础上,为打印您输入的第3场,那么语法是:

awk -v f="$1" '{ print $f }' 

所以在上面你可以尝试:

!ls -l | awk -v f="$1" '{print $f}' 

或如果需要加倍壳体“$”s:

!ls -l | awk -v f="$$1" '{print $f}' 

希望有帮助。