【问题标题】:How do I extract device info and mountpoints from fstab using Perl?如何使用 Perl 从 fstab 中提取设备信息和挂载点?
【发布时间】:2012-01-25 18:37:12
【问题描述】:

我是 Perl 新手,我真的需要帮助解决一个特定问题。

我需要从我的 fstab 中提取信息,但那里有很多信息,我只想要有关设备及其挂载点的信息。 我最接近找到答案的是: http://www.freebsd.org/doc/en/articles/vinum/perl.html

但由于我是 Perl 新手,因此我很难调整代码,因此它可以帮助我解决问题

这是我的 fstab,但我只想要 3 条“dev”行,包括挂载点,有什么聪明的方法吗?

/dev/disk/by-id/usb-ST925041_0AS_FF9250410A0000000000005FF87FF7-part2 /                    
ext3       noatime,nodiratime,acl,user_xattr 1 1
/dev/disk/by-id/usb-ST925041_0AS_FF9250410A0000000000005FF87FF7-part3 /var/log             
ext3       noatime,nodiratime,acl,user_xattr 1 2
/dev/disk/by-id/usb-ST925041_0AS_FF9250410A0000000000005FF87FF7-part1 swap                 swap       
defaults              0 0
proc                 /proc                proc       defaults              0 0
sysfs                /sys                 sysfs      noauto                0 0
debugfs              /sys/kernel/debug    debugfs    noauto                0 0
usbfs                /proc/bus/usb        usbfs      noauto                0 0
devpts               /dev/pts             devpts     mode=0620,gid=5       0 0

非常感谢帮助,在此先感谢!

【问题讨论】:

  • "This is my fstab. There are many like it, but this one is mine." 这是您的 perl 脚本的输出,而您只想要前三行吗?或者你在问什么?
  • 顺便说一句,您链接中的脚本已有 11 年历史。
  • 是的,这是我得到的输出,我想过滤它,所以我只得到设备名称,例如:/dev/disk/*/*/*/*part2 (mountpoint) For所有 3 台设备
  • 一些建议:如果你问一个问题“我怎样才能编辑这个 500 行的脚本来做我想做的事?”,你不会得到任何答案。如果你问“我怎样才能从这个输出中提取这些行?”您将在几分钟内得到答案。
  • 我试过这样问,但我只获得了有关如何从文件中获取信息的信息,而且我知道如何做到这一点正如问题中所述,我不能采取“一般”的答案,因为我还不能调整代码,所以它们可以帮助我

标签: perl


【解决方案1】:

如果这是您的输出,并且您只想获取以 /dev 开头的行,您可以简单地将其通过管道传输到 grep,而无需更改您的 perl 脚本。

perlscript.pl | grep "^/dev"

不确定没有-e 标志是否有效,已经有一段时间了,我现在无法测试它。如果一切都失败了,请使用 perl:

perlscript.pl | perl -nwe 'print if m#^/dev#'

【讨论】:

  • 奇怪,因为我以前尝试过,但当时我使用另一个命令打开文件并打印它现在当我使用反引号时,这个简单的编码帮助了谢谢!寻求帮助 =) 祝你有美好的一天
【解决方案2】:

这样的东西应该没问题,那么:

#!/usr/bin/perl

open (my $fstab, "<", "/etc/fstab") or die "Cannot open /etc/fstab.";

while(<$fstab>)
{
    my @list = split;
    next if($list[0] !~ m,^/dev,);
    print "Device : $list[0]\nMountpoint : $list[1]\n";
}

close($fstab);
exit 0;

请记住,如果您的 fstab 具有 UUID= 条目或任何不在 /dev 中列出的设备类型的文件系统,这将不起作用。

【讨论】:

  • 如果要使用其他分隔符,则需要在m/// 中使用m。例如:m,^/dev,
  • 你可以在单行中做到这一点:perl -ane 'printf("Device: %s\nMountpoint: %s\n", @F[0,1]) if $F[0] =~ m#^/dev#;' /etc/fstab
  • 您应该将其发布为答案。显然,我的 Perl 技能无法与你相提并论。
  • 另一方面,你的 *nix mojo 似乎比我的强。不,答案是你的。我只是告诉你如何修饰它。
猜你喜欢
  • 2011-10-13
  • 1970-01-01
  • 2014-01-25
  • 2019-05-09
  • 1970-01-01
  • 1970-01-01
  • 2015-09-11
  • 2014-11-23
  • 2012-01-15
相关资源
最近更新 更多