通过Python而不是常规Bash程序轻松处理CLI操作

2022-02-15 00:16:38

有没有想过在Bash中使用Python?你会选择Python语法而不是sed、awk等等吗。。。?如果您确切地知道在Python中使用什么命令,但最终却一次又一次地查询man,请进一步阅读。该实用工具允许您对shell进行pythonize:通过pz传输任意内容,并加载您的小Python脚本。

通过pz进行pythonization时,您的数据看起来如何?实用程序可以替代哪些Bash程序?

请注意,在参数周围隐藏引号可能不起作用(Zsh)或导致意外行为:触摸s1&&;echo和#34;你好";|pz s[1]→ 例外情况:<;39岁;名称错误'>;。使用echo和#34;你好";|pz和#39;s[1]和#39;相反

#让';使用f-string`--format`flagtail-f/var/log/syslog |pz-f';{len(s)}:{s}';#或者长期使用,显式设置's'variabletail-f/var/log/syslog | pz';s=str(len(s))+";:" + s';

替换切口。注意,您可以链接多个pz呼叫。被逗号分隔'', 然后使用n访问转换为数字的行。

替换sed。我们知道re库中的所有功能都已经包括在内,例如:";findall";。

#或者使用`--findall`flagpz--findall";(https?:/[^\s]+)和#34&书信电报;文件记录#或展开“--findall”标志等效于tpz"的完整命令;findall(r';(https?:/[^\s]+)';,s) "&书信电报;文件日志

如果链接,则可以在当前web浏览器中打开所有URL。请注意,功能webbrowser。open从标准库自动导入。

更换| awk和#39;{count+=$1}END{print count}';或者|粘贴-sd+| bc。只需在--end子句中使用sum。

#内部更改为--end`s=sum(number)`echo-e";1\n2\n3\n4";|pz——最终总和#10

替换| sort | uniq没有什么意义,但演示给出了一个想法。我们初始化一个集合c(就像一个集合)。在处理一行时,如果已经看到跳过,则将其设置为True。

然而,与| sort | uniq相比,在处理流时有一个优势。您可以立即看到独特的线条,而无需等待流结束。与tail一起使用时很有用——跟随。

或者,为了确保对值进行排序,我们可以使用--end标志,在处理完成后生成输出。

请注意,我们使用了默认情况下初始化为空集的变量S(因此我们根本不必使用--setup)和标志-0来防止处理输出(我们不必使用skip参数)。

(严格来说,我们也可以省略-0。如果使用verbose-v标志,您会看到命令在内部更改为s=s.add(s)。从设定开始。“添加”不会生成任何输出,这与跳过它的情况相同。)

我们可以省略主句中的(s),从而去掉所有的引号。

然而,最直接的方法是使用--end子句时使用lines变量。

我们将行拆分以获取单词,并将它们放入S中,这是集合的一个全局实例。然后,我们打印设置的长度以获得唯一单词的数量。

但是,如果我们想得到最常见的单词及其用法,该怎么办?让';让我们使用C,一个集合的全局实例。柜台我们看到红色是最常见的词,已经被使用了两次。

$echo-e";红绿\n蓝红绿";|pz和#39;C.更新(s.split())和#39--C端:最常见的红色、绿色、蓝色、1

多亏了图书馆,上网很容易。这里,我们来举个例子。com,对所有包含";href";并在剥离空间的同时打印出来。

$echo和#34;http://example.com " | pz和#39;请求。得到(s)。内容';|grep href | pz s.strip<;p>&书信电报;a href=";https://www.iana.org/domains/example " >;更多信息</a></p>;

要查看自动导入是如何解决的,请使用详细模式。(请注意导入请求的行。)

$echo和#34;http://example.com " | pz和#39;请求。得到(s)。内容'-v|grep href |pz s.strip将命令子句更改为:s=requests。得到(s)。内容导入请求<;p>&书信电报;a href=";https://www.iana.org/domains/example " >;更多信息</a></p>;

为了匹配每一行带有引号的表达式并打印出引用的内容,您可以使用Python三重引号。在下面的示例中,使用撇号分隔命令标志。如果我们在课文中使用撇号,我们将不得不删掉它。相反,三重引号可能会提高可读性。

在这种情况下,更好的方法是使用--match标志来尽可能地消除引用。

背景中发生了什么?阶乘可以从数学中找到。阶乘的。因为它是可调用的,所以我们尝试将当前行作为参数:factorial(s)。因为s=";5" 这意味着一个字符串,它失败了。然后它尝试使用阶乘(n),其中n是自动提取到数字的当前行。行得通。

没有内置的图书馆?让';那就用自行车吧。处理从1到n(即5)的所有数字,然后乘以乘积。最后,将n分配给输出的s。

回声5 | pz#39;对于范围(1,n)内的c:n*=c;s=n';#120

由于csv是自动导入的库之一,我们可以直接访问并实例化reader对象。在下面的示例中,我们逐步或在处理完成后立即输出每行的第二个元素。

#输出逐行回波#39"a""b1、b2、b3和#34"c"' | pz和#34;(x[1]代表csv.reader([s])中的x和#34;#"b1、b2、b3和#34;#输出端回声'"a""b1、b2、b3和#34"c"' | pz——结束";(x[1]代表csv.reader中的x(行))";#"b1、b2、b3和#34;

让';s生成几个长度为1到30的随机字符串。如果使用的生成器标志没有数字,它会循环五次。

#打印当前行“count”和当前平均值“sum/count”$while:;do echo$((1+$RANDOM%100));睡眠0.1;完成| pz和#39;总和+=n;s=计数、总和/计数和#39--设置";总和=0";1,38.02,67.03,62.04,49.75#每10000行打印一次#(感谢'not i%10000'表达式)$while:;do echo$((1+$RANDOM%100));完成| pz和#39;总和+=n;s=总和/计数;s=(计数,s)如果不计数%10000,则为其他"" ' --设置";总和=0";10000, 50.905820000, 50.734430000, 50.69346666666666640000, 50.5904

如何简化?让';s使用一个无限的生成器-g0。正如我们所知,n由生成器给定当前行号,而i默认隐式声明为i=0,因此我们使用它来保存和。不需要设置条款。不需要Bash循环。

$pz";i+=randint(1100);s=(n,i/n)如果不是n%10000其他'' " -g010000、49.948820000、50.539930000、50.399066666740000、50.494425

如果需要计算短多行语句,请使用Bash支持的标准多行语句。

$echo-e";1\n2\n3";|pz和#34;如果n>;2:s=';更大';其他:s=';较小的'"小的大的

通过生成一个长的数字序列来模拟一个漫长的处理过程(因为不需要它们,我们将它们按1>;/dev/null丢弃)。在每100行上,我们向上移动光标(\033[1A),清除行(\033[K),并打印到STDERR当前状态。

$SEQ100000 | pz和#39;s=f"\033[1A\033[K…{count}…";如果count%100==0,则无';--stderr 1>;/dev/null…100…#替换为…200。。。

有时输入无法轻松转换为str。虽然会输出一条警告,但您仍然可以使用原始字节进行操作。

echo-e';\x80无效行';|pz不能正确解析行:b';\x80无效行';� 无效行#使用`--quiet`标志抑制警告,然后解码字节echo-e';\x80无效行';|pz和#39;b、 解码(";cp1250";)' --无效线路

#每1000行显示一次$pz-g0 n*3 | pz和#34;n如果不算%1000,则不算";3000060009000#相同,使用`--filter`标志$pz-g0n*3 |pz-F";不算%1000";

不适用于--overflow safe标志集,也不适用于main子句,除非设置了--whole标志集。例如:获取字符计数(替代| wc-c)。

$echo-e";1\n2\n3";|pz和#39;len(文本)和#39;你不是忘了用文本吗?例外情况:<;39岁;名称错误'>;姓名';文本';未在第行定义:1

设置了--overflow safe标志时不可用。示例:显示流的当前平均值。更具体地说,我们输出元组:行计数、当前行、平均值。

$echo-e";20\n40\n25\n28和#34;|pz和#39;s=计数,s,和(数)/计数和#39;1, 20, 20.02, 40, 30.03, 25, 28.3333333333333324, 28, 28.25

如果设置为True,则不会输出当前行。如果在使用-0标志时设置为False,则该行将被输出。

一些变量已初始化,可以全局使用。它们在所有的线路中都很常见。

的确,使用大写不符合命名约定。然而,在这些微小的脚本中,可读性是首要原则,每个字符都很重要。

使用集合S。在本例中,我们将每一行添加到集合中,并以排序方式将其打印出来。

使用列表L。追加包含大于1的数字的行,最后打印它们的计数。因为只有最终计数才重要,所以使用-0标记抑制行输出。

其他一些则在检测到其使用时自动导入。在这种情况下,管线将重新处理。

警告:首次访问时,自动导入会使行重新处理。它可能会影响你的全局变量。使用详细输出查看是否自动导入了某些内容。

$echo-e";嘿\nbuddy";|pz和#39;a+=1;睡眠(1);b+=1;s=a、b和#39--设置";a=0;b=0" -从时间2、13、2导入睡眠

如图所示,a增加了3倍,b增加了两倍,因为为了自动导入睡眠,我们必须处理第一行两次。在第一次运行中,处理引发了一个异常,因为不知道睡眠。为了防止出现这种情况,可以将time import sleep显式地附加到--setup标志。

考虑管道两条和39条;嘿';和';巴迪';。我们返回三个元素,原始文本、反向文本及其长度。

列表:当s最终成为一个列表时,它的元素被打印成独立的行。

常规匹配:所有组都被视为一个元组。如果没有使用组,则打印整个匹配字符串。

#没有团体→ 打印完整匹配的字符串echo";你好,世界";|pz和#39;搜索(r";\s.";,s)';#" 世界";#单组匹配回声#34;你好,世界";|pz和#39;搜索(r";\s(.*)";,s) &39;#"世界";#匹配组被视为元组回声#34;你好,世界";|pz和#39;搜索(r";(.*)s(.*)和#34;,s) &39;#"你好,世界";

Callable:它会被调用。在处理简单函数时非常有用——不需要显式地放入括号来调用函数,我们可以在Bash中省略引号(必须引用表达式s.lower())使用verbose标志-v检查命令的内部更改。

#内部更改为's=s.lower()'echo";你好";|pz s.下#和#34;你好";#内部更改为's=len(s)'echo";你好";|pz len#";5" # 内部更改为's=base64。B64编码(s.encode(';utf-8';)`echo和#34;你好";|pz B64编码#和#34;SEVsbE8=";#内部更改为's=math。sqrt(n)`s=round(n)`echo";25 " | pz sqrt | pz round#和#34;5" # 内部改为's=sum(number)`echo-e";1\n2\n3\n4";|pz sum13610#内部改为';-'.加入(行)`echo-e";1\n2\n3\n4";|pz——结束"' - '.加入";1 - 2 - 3 - 4

正如您在示例中看到的,如果出现TypeError,我们将尝试重新处理该行,同时添加当前行作为参数:

-v、 --详细:看看引擎盖下面发生了什么。显示自动导入和内部命令修改(尝试使其可调用,如果省略,则在s=前加前缀)。$echo-e";你好";|pz和#39;无效命令';例外情况:<;39岁;SyntaxError和#39>;第1行的语法无效(<;string>;,第1行):hello$echo-e";你好";|pz和#39;睡眠(1)和#39--逐字逐句

-S命令,-setup命令:任何Python脚本,在处理之前执行。用于变量初始化。例如:通过增加一个变量计数来预先结束行号。$echo-e";第34排pz和#39;计数+=1;s=f";{count}:{s}"' --设置';计数=0';1:第2行:另一行#使用全局可用变量'count'而不是使用'--setup'和'--format'标志$echo-e";第34排pz-f';{count}:{s}';

-E命令,--end命令:任何Python脚本,在处理后执行。对最终输出有用。默认情况下,变量文本在此处可用。$echo-e";1\n2\n3\n4";|pz——最终价格10美元echo-e";1\n2\n3\n4";|pz s——最终金额123410美元echo-e";1\n2\n3\n4";|pz总和——结束总和1361010

-F、 --过滤器:管线输出不变,但仅当计算为True时。当管道数为5时,我们只通过大于3的管道。该语句相当于使用skip(而不是使用--filter)。不使用过滤器时,s的计算结果为True/False。默认情况下,不会输出假值或空值。

-f、 --格式:主句和尾句被视为f字串。该条款插入三个撇号f和#39之间''指挥部''' 内部。

--空输出,甚至空行。(默认情况下跳过。)考虑用3个最后的字母缩短文本。第一行,嘿,然后就完全消失了。

-g[NUM],--generate[NUM]在忽略输入管道的情况下生成行。行将对应于迭代周期计数(除非在具有无限生成器的情况下启用了--overflow safe标志——在这种情况下,行将等于';1';)。如果未指定NUM,默认情况下将生成5行。将NUM==0表示一个无限的生成器。如果没有设置main子句,则通过管道输出该数字。

$pz-g212$pz和#39;i=i+5'-g-v将主句改为:s=i=i+5生成s=1。。5510152025

--标准印刷条款';输出到STDERR,同时让原始行完整地通过管道传输到STDOUT。用于在长时间操作期间生成报告。看看下面的例子,每隔三行STDERR就会收到一条消息。

$pz-g=9s | pz#34;s=';处理接下来的几行';如果计数%3==0,则无"--stderr 123处理后几行456处理后几行789处理后几行

通过将STDOUT写入文件并将STDERR留在终端中来演示不同的管道。

$pz-g=9s | pz#34;s=';处理接下来的几行';如果计数%3==0,则无"--stderr>/tmp/Example处理后几行处理后几行处理后几行处理后几行SCAT/tmp/Example 123。。。

--溢出安全防止行、数字、文本变量可用。在处理无限输入时非常有用。

#防止用defaultecho-e"填充“text”;1\n2\n2\n3";|pz——结束";len(文本)和#34--在访问“文本”时,您没有忘记使用--while吗?例外情况:<;39岁;名称错误'>;姓名';文本';在--end子句#force to populate`text`echo-e"中没有定义;1\n2\n2\n3";|pz——结束";len(文本)和#34--溢流保险箱——全套