Perl和; Bash:寻找正则表达式

时间:2013-07-09 12:33:26

标签: regex perl bash find sh

这是我的问题:

我有一个perl脚本,可以为我搜索一些Linux文件。 文件名是这样的:

shswitch_751471_126.108.216.254_13121

问题在于

13121

是一个随机增加的id。 我正在尝试,因为今天早上要搜索正确的正则表达式,但我找不到它!拜托,你能帮忙吗?

这就是我所拥有的:

#!/usr/bin/perl 
$dir = "/opt/exploit/dev/florian/scan-allied/working-dir/";
$adresse ="751471" ; 
$ip =  "126.108.216.254";
$tab=`find $dir -type f -name \"$dir_$adresse_$ip_*\"`; 
print $tab;
我甚至试过

    $tab=`find $dir -type f -name \"$dir_$adresse_$ip_[0-9]{1}\"`;

但是perl不会听我的话:(

3 个答案:

答案 0 :(得分:2)

问题是您已将$dir包含在传递给find的文件名中。

您可能想说:

$tab=`find $dir -type f -name \"shswitch_${adresse}_${ip}_*\"`; 

答案 1 :(得分:2)

更改此行:

$tab=`find $dir -type f -name \"$dir_$adresse_$ip_*\"`; 

$tab=`find $dir -type f -name \"${dir}_${adresse}_${ip}_*\"`; 

答案 2 :(得分:1)

唔。如果您使用,那么您根本不需要致电find(1)!如果您使用File::Find模块,则可以在没有外部呼叫的情况下获得更好的find。尝试这样的事情:

#!/usr/bin/perl

use strict;
use warnings;
use File::Find;

my $dir = "/opt/exploit/dev/florian/scan-allied/working-dir/";
my $addresse ="751471" ; 
my $ip =  "126.108.216.254";
my $re = "shswitch_${addresse}_${ip}_\d+";

sub wanted {
    /^$re$/ and -f $_ and print "$_\n";
}

find \&wanted, $dir;

这将打印所有匹配的文件。

您可以使用find2perl实用程序将完整的find命令行转换为wanted函数!

对于

find2perl /opt/exploit/dev/florian/scan-allied/working-dir -type f -name \"shswitch_751471_126.108.216.254_${ip}_*\"

提供以下代码:

#! /usr/bin/perl -w
    eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
        if 0; #$running_under_some_shell

use strict;
use File::Find ();

# Set the variable $File::Find::dont_use_nlink if you're using AFS,
# since AFS cheats.

# for the convenience of &wanted calls, including -eval statements:
use vars qw/*name *dir *prune/;
*name   = *File::Find::name;
*dir    = *File::Find::dir;
*prune  = *File::Find::prune;

sub wanted;



# Traverse desired filesystems
File::Find::find({wanted => \&wanted}, '/opt/exploit/dev/florian/scan-allied/working-dir');
exit;


sub wanted {
    my ($dev,$ino,$mode,$nlink,$uid,$gid);

    (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
    -f _ &&
    /^"shswitch_751471_126\.108\.216\.254__.*"\z/s
    && print("$name\n");
}