admin 管理员组

文章数量: 887016


2024年2月25日发(作者:div css模板是什么意思)

Perl命令行使用技巧

Perl在设计之初就是为了能够整合shell、awk、sed、sort、grep等工具的目的而出现的,我们习惯在unix/linux下使用系统为我们提供的一系列优秀的工具进行文本处理、文件管理,那是便捷并且是可行的。但是在windows下我们在日常办公过程中,如果需要进行比较复杂的文本处理,是否必须把文本粘贴到linux下,用我们习惯的方式进行处理,或者是使用ultraedit、word之类的工具想其他办法处理呢?如果你熟悉perl的话,那么只需要安装perl的win32版本,unix下常规的awk、sed、grep、sort等工具的功能是完全可以实现的。并且只要掌握以下的一些方法,所有的文本处理都可以放在一个perl解释器进程中完成,不需要另外调用awk或sed等,减少了shell与awk数据传递的麻烦。下面我就简单的举几个例子进行说明:

1. 一个命令行模拟awk:

# 将第一列和倒数第二列相加

# 等同awk脚本:

awk '{i = NF - 1; print $1 + $i}'

perl -lane 'print $F[0] + $F[-2]'

举例1:如果有文件

1 2 3 4

5 6 7 8

使用命令行:perl -lane 'print $F[0] + $F[-2]'

执行后结果为:

4

12

简要说明:

 -l 参数是在打印每一行运算结果后加上行结束符(默认为换行符),如果没有此参数,上例的输出就会是:

412

 -a 与-n参数一起使用时开启类似awk的自动分割输入行的功能,默认使用空格或tab分割,可以使用-F参数指定分割符。分割的内容放入特定的数组@F。

 -n 参数开启按行读取的功能,类似awk的方式一行行从文件中读取

 -e 参数将后边的串内容作为perl代码处理

2. 打印文件中的一系列行:

a) 打印行号范围内的内容:

# 打印文件中15到17行的内容

perl -ne 'print if $. >= 15; exit if $. >= 17;'

# 或者更为简单

perl -ne 'print if 15 .. 17'

简要说明:

 $. 为perl中的默认变量,存储当前的行号,与awk中的NR意义相同。

 15..17表示范围,“..”操作符指示范围

 默认读入的行放置在$_中,print的默认处理对象也是$_

b) 打印文件中配对标识之中的内容:

# 打印文件中行内容为“BEGIN”和“END”之间的行内容

perl –ne ‘print if /^BEGIN$/../^END$/

简要说明:

 //是指示使用正则表达式,这里标识一行中只有BEGIN或END的行。正则表达式默认匹配$_。

3. sed的功能,文件编辑:

a) 在线替换文件中特定内容

# 将所有.c文件中的“ray”替换为“pac”,并且将源文件备份为.bak

perl -p - -e 's/brayb/pac/g' *.c

简要说明:

 -i 参数表示原地修改文件(同sed中的-i),如果提供可选参数,则使用它为后缀建立源文件备份。

 -p 参数基本同-n 参数,只是在处理完成后插入一条print,将处理结果打印出来,同sed的行为

 正则表达式中b匹配单词边界,

b) 删除文件中的特定行:

# 删除文件中的前10行:

perl –ne –

'print unless 1 .. 10'

c) 处理文件中的数字:

# 将.c和.h文件中所有的数字全部加一:

perl - -pe 's/(d+)/ 1 + $1 /ge' *.[ch]

简要说明:

 正则表达式中d+代表匹配数字(长度不限),$1是指前边的第一个表达式所匹配上的内容

d) 在正则表达式中进行运算:

# 将文本中所有的“ray”用小于611的随机数替代

perl – –pe “s/ray/int rand(611)/ge” *.txt

简要说明:

 正则表达式中的int rand(611)是指取小于611的随机数,并取整

 正则表达式的命令字/e表示此表达式中有需要perl来处理的语句,并且将处理结果作为表达式内容

e) 在文件中插入4位数字的行号:

perl – -pe'$_ = sprintf "%04d %s", $., $_'

4. 文件管理功能:

a) 批量文件重命名:

# 将所有.txt文件的首字母修改为大写

ls *.txt | perl –ne „chomp;printf “mv $_ %s”, ucfirst $_”

或者直接:

ls *.txt | perl –ne „chomp;rename $_, ucfirst $_”

简要说明:

 第一个表达式只是打印对应的shell命令,需要使用者获得输出然后执行

 第二个表达式直接调用perl的rename函数,对文件重命名

后记:仔细研究perl,可以为我们的运维工作带来很多方便,单行的perl指令往往比调用awk、sed更为方便快捷。下面是perl的一些命令行参数列表,供大家参考:

整洁性

-w 打开警告

-Mstrict 打开严格编译指示(pragma)

数据

-0 (这是个零)指定输入记录分隔符

-a 将数据分割成名为 @F 的数组

-F 指定分割时 -a 使用的模式(请参阅 perldoc -f split)

-i 在适当的位置编辑文件(请参阅 perldoc perlrun 以获取大量详细信息)

-n 使用 <> 将所有 @ARGV 参数当作文件来逐个运行

-p 和 -n 一样,但是还会打印 $_ 的内容

执行控制

-e 指定字符串以作为脚本(多个字符串迭加)执行

-M 导入模块

-I 指定目录以搜索标准位置前的模块


本文标签: 文件 使用 参数 处理 分割