我尝试使用perl格式化
来格式化/ etc / passwd文件这是我到目前为止所提出的:
#!/usr/bin/perl
use warnings;
format MYFORMAT =
@<<<<<<<<<<<<<<<| @<<<<<<<<<<<<<<<| @<<<<<<<<<<<<<<<
$username, $UID, $name
.
$username = `cut -d: -f1 /etc/passwd`;
$UID = `cut -d: -f3 /etc/passwd`;
$name = `cut -d: -f5 /etc/passwd`;
$~ = "MYFORMAT";
write;
我没有收到任何警告或错误。格式化工作,但问题是,它只显示etc / passwd文件的第一行。我只将root,0和root分别作为用户名,UID和名称。
我需要为每列打印所有用户名,UID和名称。我不知道自己做错了什么,因为当我运行bash命令只获取终端内的用户名时,它会显示所有这些用户名。但它不会在剧本中做到这一点。
答案 0 :(得分:1)
您没有循环遍历/ etc / passwd文件,您将第一组字段返回到您的变量中,但之后只使用第一组字段。考虑一下:
#!/usr/bin/perl
$username = `cut -d: -f1 /etc/passwd`;
print $username;
而是尝试perl myscript.pl&lt; / etc / passwd用这个脚本:
#!/usr/bin/perl
use warnings;
use strict;
my $username;
my $UID;
my $name;
format =
@<<<<<<<<<<<<<<<| @<<<<<<<<<<<<<<<| @<<<<<<<<<<<<<<<
$username, $UID, $name
.
while (<>) {
($username, undef, $UID, undef, $name, undef) = split(':');
write();
}
输出如下:
~/tmp$ perl t2.pl < /etc/passwd
root | 0 | root
daemon | 1 | daemon
bin | 2 | bin
sys | 3 | sys
sync | 4 | sync
games | 5 | games
如果您没有为您的格式指定名称,则STDOUT是默认值。您可以从/ etc / passwd中读取每一行并单独处理。