如何使用perl格式化格式化/ etc / passwd文件

时间:2017-11-15 21:41:07

标签: bash shell perl

我尝试使用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命令只获取终端内的用户名时,它会显示所有这些用户名。但它不会在剧本中做到这一点。

1 个答案:

答案 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中读取每一行并单独处理。