【发布时间】:2012-05-28 02:37:37
【问题描述】:
我有一个在命令行上运行良好的 Perl 单行代码:
perl -nle 'm"\w+:x:\d+:\d+:\S+:/S+:(\S+)$" and $h{$1}++; END{ print "$_: $h{$_}" foreach sort { $h{$b} <=> $h{$a} } keys %h }' /etc/textfile
我已将其放入名为 shell.sh 的 shell 文件中,这样下一个人就不必复制/粘贴,只需运行它即可:
#!/bin/sh
perl -nle 'm"\w+:x:\d+:\d+:\S+:/S+:(\S+)$" and $h{$1}++; END{ print "$_: $h{$_}" foreach sort { $h{$b} <=> $h{$a} } keys %h }' /etc/textfile
我尝试在命令行上运行它并没有得到任何结果;它只是加载一个没有输出的新提示。有人看到我做错了吗?
以下是一些系统规格:
Linux 版本 2.6.32-220.13.1.el6.x86_64
(gcc 版本 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC)
GNU bash,版本 4.1.2(1)-release (x86_64-redhat-linux-gnu)
以下是文本文件中的一些内容:
rfink:x:140:140:rat fink:/var/lib/rfink:/sbin/nologin
edible:x:16252:10001:eric idle:/users/eidle/:/bin/bash
tsawyer:x:30855:10001:tom sawyer:/users/tsawyer/:/bin/bash
karthur:x:30886:10001:King Arthur:/users/karthur/:/bin/bash
karthur:x:30886:10001:king arthur:/users/karthur/:/bin/bash
jcash:x:30887:10001:john cash:/users/jcash/:/bin/bash
hpotter:x:30887:10001:harry potter:/users/hpotter/:/bin/bash
triddle:x:30956:10001:tom riddle:/users/triddle/:/bin/bash
【问题讨论】:
-
你能从文本文件中展示一个样本吗?
-
已添加。我很确定正则表达式是正确的,因为单行从命令行工作。关于 shell 脚本的某些东西似乎搞砸了。
-
/etc/textfile中的问题示例中的所有尾随空格是否逐字逐句? -
最后一行说明了这一点。每行有 1 个尾随空格(所有其他行上的多个空格都发生在 c/p 中)。
-
这无济于事,但为什么不将 perl 单行代码转换为 perl 脚本而不是 bash 脚本呢?
标签: regex linux perl command-line