perl一行式

寒假来了意识到自己还有很多要学的东西。我作为一个菜鸟,在平时干活的时候就发掘很多东西还没弄清楚。perl作为文本处理的强大利器,有人甚至认为perl的一行式可以替代linux文本处理的三驾马车grep,awk,sed,此贴先记录一下一行式的语法。


image.png

1 -e
e参数后面跟表达式,使用单引号括起来
例如,我想在命令行中直接打印hello world.
这样的话就不用编写一个脚本,直接在命令将实现要的功能。

perl -e 'print  "hello world\n"'

如果你觉得一行写不下,要多行,可以先不输入最后一个单引号,按下enter键就会自动换行。
2 -n和-p
如果只有-e,那么单行式的存在并没有太大的意义。
-n 相当于while(<>);
-p 自动循环+输出,也就是while(<>){命令(脚本); print _。-n和-p都可以把文件内容读取进来。他们之间的区别是-p自带打印功能,会把所有行输出。

需要输出所有行时,使用-p;
需要输出处理过的行,使用-n即可。

假设有一个test.txt文件,内容为

abc
123
shuzi

perl -n -e 'if(/abc/) {print $_;} ' test.txt
输出结果为:

abc

perl -p -e 'if(/abc/){print $_;}' test.txt
输出结果为:

abc
abc
123
shuzi

除了符合条件的结果外,还把原有所有行都输出了。
还可以看到,输出的结果自带换行,原因是原有数据自带换行符。
3 -l
那么我们想实现读取行后,自动chomp和输出的行加上\n

-l 对输入的内容进行自动chomp,对输出的内容自动加换行符

4 -a -F
-a 自动分隔模式,用空格分隔每行内容,即_;
-F可以指定分割的内容

下面这两段代码是一样的,-a自带指定了分割符号为空格

df |perl -n -a -F"\s+" -e 'print $F[0],"\n";'
df |perl -n -a  -e 'print $F[0],"\n";'

参考资料:
https://www.zhangshengrong.com/p/OwradrxXBE/#:~:text=8%E3%80%81perl%E5%8D%95%E8%A1%8C%E5%91%BD%E4%BB%A4%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8perl%E7%9A%84%E6%A8%A1%E5%9D%97%EF%BC%8C%E5%A6%82%E4%BD%BF%E7%94%A8sum%E5%87%BD%E6%95%B0%E7%9A%84%E6%A8%A1%E5%9D%97%EF%BC%9A%20perl%20-MList%3A%3AUtil%3Dsum%20-alne%20%27print%20sum%20%40F%27%209%E3%80%81perl%E4%B9%9F%E5%8F%AF%E4%BB%A5%E5%83%8Fawk%E4%B8%80%E6%A0%B7%E4%BD%BF%E7%94%A8END%E5%91%BD%E4%BB%A4%EF%BC%8C%E5%A6%82%E6%89%93%E5%8D%B0%E5%87%BA%E6%96%87%E4%BB%B6%E4%B8%AD%E6%80%BB%E5%8D%95%E8%AF%8D%E4%B8%AA%E6%95%B0,END%20%7B%20print%20%24t%7D%27%2010%E3%80%81perl%E4%B9%9F%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8%20map%20%7B%7D%20%E7%AD%89%E5%87%BD%E6%95%B0%EF%BC%8C%E5%A6%82%E6%89%93%E5%8D%B0%E5%87%BA%E5%8C%B9%E9%85%8D%E4%B8%8A%E7%9A%84%E5%8D%95%E8%AF%8D%E7%9A%84%E6%80%BB%E4%B8%AA%E6%95%B0

https://wangtp.top/2019/12/23/%E7%94%9F%E4%BF%A1%E5%8D%95%E8%A1%8C%E8%84%9A%E6%9C%AC/

https://www.jianshu.com/p/63e2abb1b788

你可能感兴趣的:(perl一行式)