在shell中使用python,就好像它是awk一样

时间:2014-09-15 21:37:00

标签: python shell awk

我想在stdout上print 1 + 1(即单线编码)。

使用awk我只需使用以下内容即可:

$ echo | awk '{print 1+1}'
2

如何使用python执行此操作?

5 个答案:

答案 0 :(得分:8)

您正在寻找-c

$ python -c 'print 1 + 1'
2

答案 1 :(得分:2)

正如ifLoop指出的那样,你在这里寻找的是-c

但是,正如你发现的那样,python -c通常不会与相应的awk(或sedbash或{{{{}}一样有用1}}甚至perl)用于单行。

Python明确地设计用于重视可读性而非简洁性和显性性而不是隐含性(以及一些相关的权衡,如语法上的词汇,尽可能少的魔法等)。见the Zen of Python。对于你可以塞进一行的内容存在有意的限制,例如,在rubysys.stdin或{{{{}}} sys.argv或{fileinput.input()上必须明确地执行诸如循环stdin和/或命令行参数之类的操作。 1}}。

这意味着使用Python编写一些非常简单的脚本变得不那么容易,但这被认为是一个很好的权衡,即使是中等重要的脚本也更容易编写,维护和理解。

核心开发人员明白这意味着你不能用Python重写很多单行代码。如果你问他们,他们中的大多数人都会问为什么这个问题根本就存在。

如果你知道如何用sedawk这样的语言写一些内容,那么你应该把它写成sedawk中的单行代码{1}}。对于各种简单的任务来说,这些都是非常好的语言,并且没有理由因为Python也是一门优秀的语言而无法避免它们。

如果你无法通过语法来编写单行代码......那么,它可能不应该是单行代码。你想在Python中尝试它的唯一原因是Python通常更容易编写和阅读,同样的原因是同样的原因,Python不会让你在没有3行的情况下写出你想要的东西。所以只写3行。 Python非常适合。

所以,你经常真正想要的不是-c,而是heredoc,或者只是像任何其他程序一样运行的单独脚本,或{{1 }或awk代替perl

答案 2 :(得分:1)

如果你在shell中,那么下一个是基本的整数数学

echo $((1+1))
echo $(( 100 / 5 ))

等...

浮点数,是的,您应该使用awkbcdc,或任何其他知道浮点数学的语言......

另请阅读:https://stackoverflow.com/a/450853/632407

答案 3 :(得分:0)

受到answer by IfLoop的启发,我想知道awk中方便的BEGINEND块。我找到了pawk module

    ls -l | awk 'BEGIN {c = 0} {c += $5} END {print c}'
    ls -l | pawk -s -B 'c = 0' -E 'c' 'c += int(f[4])'

看起来很有希望,但我从未尝试过(尚未)

答案 4 :(得分:0)

SingleNegationElimination's回答推荐的一样,-c标志是该作业的正确工具。

以下是使用awk,ruby和python的一些示例:

echo foo bar baz | awk '{ split($0, arr, " "); print arr[NF] }'
baz
echo foo bar baz | ruby -e 'puts STDIN.read.chomp.split(" ")[-1]'
baz
echo foo bar baz | python -c 'import sys; print sys.stdin.read().rstrip().split(" ")[-1]'
baz