曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 5708|回复: 0
打印 上一主题 下一主题

命令行参数之 -F -- 指定分隔符

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
跳转到指定楼层
楼主
发表于 2012-7-19 15:32:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
和 awk 的 -F 选项一样,Perl 也可用该选项来指定分隔符。

供测试文本内容:
$ cat tmp.txt
hello world
hello linux
hello perl
good perler
best linuxer
strong unixer
weak windower
运行下面命令:
perl -F'\W' -ane 'END {print $x} $x += @F' tmp.txt
14
上面命令,\W 表示非单字匹配,等效于 [^A-Za-z_0-9] ,该选项和 -a  搭配起来用,意思就是说,-a  会根据内容中的有规律的非单字字符进行自动分隔,比如下面一个文本:
$ cat tmp2.txt
abc:123:kab
321:aed:net
每一行之间使用冒号进行分隔,那么对于该文本,如果想统计有多少个被冒号分隔的单元,那么同样可以使用上面的命令。当然,也可以用 -F 显示指出这个冒号分隔符,如:
$ perl -F':' -ane 'END {print $x} $x += @F' tmp2.txt
6

下面再以 /etc/passwd 为例,查看一个稍微复杂点的例子:
$ perl -F':' -ane 'chomp($F[6]); $s{$F[6]}++;' -e 'END { print "$_ : $s{$_}\n" for keys %s }' /etc/passwd
/bin/sh : 1
/sbin/halt : 1
/bin/sync : 1
/sbin/nologin : 40
/sbin/shutdown : 1
/bin/bash : 3
/bin/false : 1
该命令对 /etc/passwd 这个文件中不同的用户所使用的终端数做一个统计。命令中,$F 就是 @F  数组,它存储了以冒号分隔的各个元素,其中第 6 个元素就是终端名称,需要注意的是,所获取的终端名称里仍然包含了末尾的换行符,因此为了以后的输出美观,这里就先用 chomp()  函数将该换行符去掉。


$s 是个散列表,它以“终端名”作为其键,键所对应的值就是该终端被多少个用户所使用。$s{$F[6]}++ 正是用来累加统计用户数的。


在统计完后,在 END 中将统计结果打印出来。其中,keys 是一个函数,它能返回哈希的键列表;for 用来遍历 keys 所返回的列表,每次得到的键默认存储在预定义变量 $_ 中。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-19 05:58 , Processed in 0.062312 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表