首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Perl搜索唯一行和相应的文件名

Perl是一种强大的脚本语言,常用于文本处理和系统管理任务。在Perl中搜索唯一行及其相应的文件名可以通过多种方式实现,以下是一个基本的示例代码:

代码语言:txt
复制
use strict;
use warnings;

my %seen;
my @unique_files;

# 遍历所有文件
foreach my $file (@ARGV) {
    open(my $fh, '<', $file) or die "无法打开文件 '$file' $!";
    while (my $line = <$fh>) {
        chomp $line;
        # 如果行是唯一的,记录文件名
        if (!exists $seen{$line}) {
            $seen{$line} = $file;
            push @unique_files, $file;
        }
    }
    close $fh;
}

# 输出唯一行及其文件名
foreach my $file (@unique_files) {
    open(my $fh, '<', $file) or die "无法打开文件 '$file' $!";
    while (my $line = <$fh>) {
        chomp $line;
        if (exists $seen{$line} && $seen{$line} eq $file) {
            print "$line (文件: $file)\n";
            delete $seen{$line}; # 避免重复打印
        }
    }
    close $fh;
}

这段代码首先定义了一个哈希表%seen来存储已经遇到的行和它们所在的文件名。然后,它遍历命令行参数中提供的所有文件,打开每个文件并逐行读取。如果遇到一个之前没有见过的行,它会记录这个行和文件名。

最后,代码再次遍历所有文件,这次是为了打印出那些唯一的行及其所在的文件名。为了避免重复打印相同的唯一行,它在打印后从哈希表中删除该行。

应用场景

  • 当你需要找出在多个文件中共享的唯一数据时。
  • 在日志分析中,可能需要找出只在特定日志文件中出现的错误消息。
  • 在代码审查过程中,可能需要识别只在某个分支或提交中出现的代码行。

可能遇到的问题及解决方法

  1. 文件打开失败:确保文件路径正确,文件存在,并且Perl脚本有权限读取该文件。
  2. 内存不足:如果处理非常大的文件,可能会导致内存不足。可以考虑分批读取文件或使用更高效的数据结构。
  3. 性能问题:对于大量文件或大文件,脚本可能会运行缓慢。可以通过并行处理或优化算法来提高性能。

参考链接

  • Perl官方文档:https://perldoc.perl.org/
  • Perl正则表达式教程:https://perldoc.perl.org/perlre.html

请注意,这个脚本是一个简单的示例,实际应用中可能需要根据具体需求进行调整和优化。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【天枢系列 01】Linux行数统计:命令对决,谁才是王者?

wc -l filename 1.2 grep 命令 grep 命令用于搜索文件中与模式匹配,并可以配合 -c 选项统计匹配数量。 这里使用 ^ 来匹配每一开头,实现对所有统计。...下面是 grep 命令详细描述: 3.1 基本语法 grep [选项] 模式 文件名 3.2 主要选项 -i:忽略大小写。 -r 或 -R:递归地搜索目录中文件。 -n:显示匹配行号。...3.3 示例用法 1.在文件中搜索包含特定字符串 grep "pattern" filename.txt 2.忽略搜索大小写 grep -i "pattern" filename.txt 3.递归地在目录中搜索文件...模式可以是简单字符串,也可以是更复杂正则表达式。 如果模式中包含特殊字符,可能需要使用引号将其括起来,以防止 Shell 解释它们。 grep 支持多个文件名目录名,可以一次性搜索多个文件。...grep 命令是一个强大文本搜索工具,广泛用于查找过滤文件中信息。它支持各种选项参数,使用户能够根据不同需求进行灵活文本搜索操作。

18710

linux最快文本搜索神器ripgrep(grep最好代替者)

所以就有了很多替代工具,之前最出名是 Ack,Ag 而最近又有了新替代者 Ripgrep, 这个工具 Ack/Ag 一样都使用了多线程方法,但 rg 比它们更快 简介 ripgrep 是一个以行为单位搜索工具..., –context 显示匹配内容前面后面的 它会覆盖-B -A 选项 –context-separator 在输出中用来分隔非连续 x7F 或...来取反 可以多次使用, 会匹配.gitignore 通配符规则 -h, –help 打印帮助信息 –heading 打印文件名到匹配内容上方而不是同一 这是默认行为,可以用–no-heading...-0, –null 在打印文件路径后加一个 NUL 字符 对于 xargs 非常有用 -o, –only-matching 只打印匹配内容,而不是整行 –passthru 打印匹配不匹配...我相信它对于每一个码农价值都是无限大,特别是结合FZF之后。 唯一弱点是对正则支持,但这是一个取舍,如果采用如PCRE那样库的话,一定会极大影响速度。

4.4K51
  • grep三剑客入门与进阶指南

    out the line,全面搜索正则表达式并把打印出来)是一种强大文本搜索工具,它能使用正则表达式搜索文本,并把匹配打印出来。...-H 在显示符合范本样式那一列之前,同时打印包括搜索字符串文件。 (常用) -i 忽略字符大小写差别,因为Linux严格区分大小写(常用) -l 列出文件内容符合指定范本样式文件名称。...-R/-r 此参数效果指定“-d recurse”参数相同,递归搜索。(常用) -s 不显示错误信息。 -v 反转查找,即搜索不包含字符串文件 (显示除字符串其他类容)。...xargs -0 读取输入并用0值字节终结符分隔文件名,然后删除匹配文件,-Z通常-l结合使用。...3,使用 -A 选项: seq 10 | grep "5" -A 3 #显示匹配某个结果之前3,使用 -B 选项: seq 10 | grep "5" -B 3 #显示匹配某个结果前三后三

    1.1K10

    Linux 命令 | 每日一学,文本处理三剑客之grep命令实践

    是一种强大文本搜索工具,它能使用基础正则表达式(Base Regular Expression)搜索文本,根据用户指定模式对目标稳步进行逐行匹配,并把匹配打印出来。...目录 [常用] -L, --files-without-match 仅打印没有选定文件名 -l, --files-with-matches 仅打印选定文件名 -c, --count...# 12.匹配字符串前后NM grep -n -B 1 "公众号" learn_grep.txt # 前一 # 6-博客:blog.weiyigeek.top # 7:公众号...,按照文件类型搜索,或者按照文件里文件名进程排除匹配 # 只在目录中所有的.php.html文件中递归搜索字符"main()" grep "main()" ....find 在系统中搜索条件文件名, 如需要匹配,使用通配符匹配是完全匹配。

    11810

    文本筛选 grep

    grep 是一个文本筛选器,其实也是搜索功能,grep 工作原理是,给定一个条件,我们也叫做模式,然后从文本中筛选出符合这个条件内容,然后将这一输出出来。...-P 或--perl-regexp 使用 perl 正则表达式。 不同模式正则表达式之间稍微有些差别。...#输出选项, -h 在显示符合范本样式那一列之前,不标示该列所属文件名称。 -H 在显示符合范本样式那一列之前,表示该列所属文件名称。...-r -d 类似,用于搜索目录,可以用于搜索目录下每一个文件; #上下文控制。 -B 是 before 意思,后面接一个数字,表示将满足条件,前面几行也输出出来。...-A 是 After 意思,-B 类似,表示将满足条件,下面几行输出出来。 -C 后面接一个数字, 除了显示符合范本样式那一列之外,并显示该列之前后内容。

    1.5K20

    这些 grep 常用技巧你都会吗?

    以下是grep命令一些常用技巧: 基本用法:在命令行中输入 grep 关键词 文件名 即可搜索包含该关键词。...例如: grep -n hello myfile.txt 显示匹配之前/之后行数:使用 -A -B 选项可以分别显示匹配之后匹配之前指定行数。...grep 使用 Perl 正则表达式 使用 -P 选项可以让grep使用Perl正则表达式而不是基本正则表达式。Perl正则表达式更强大,可以支持更多特性,例如非贪婪匹配后向引用。...例如: grep -P '\d{3}-\d{2}-\d{4}' myfile.txt 这个例子使用了Perl正则表达式,在文本文件中搜索包含美国社会保险号码。...正则表达式 \d{3}-\d{2}-\d{4} 表示一个三位数,一个短横线,两个两位数一个短横线,组成了一个美国社会保险号码格式。 以下是一些常用Perl正则表达式案例: 匹配任何字符:.

    1.3K40

    Perl语言模板及配置

    这些其实都是非常小众语言,如果计算机专业的人交流,对方可能没听过这些语言。本系列“生信人写程序”主要以Perl为主,并伴随一些零星RShell编程经验技巧。...对于生信Perl使用人员有个交流互相提高平台,让新人少走点弯路。对于没有任何Perl基础强例建议别入坑,想学生信找Python教程吧,不解释看下图。 TIOBE世界编程语言使用排行 ?...很多人三或直接命令行用perl直接解决问题,虽然快,但是不容重用别人使用。.../usr/bin/perl -w # 加载时间管理,参数管理,文件名路径处理基础包,无须安装 use POSIX qw(strftime); use Getopt::Std; use File::Basename.... ############################################################################### # 正文部分,读取输入文件,列出输入输入文件作为示例

    1.3K60

    egrep命令

    egrep命令 egrep命令用于模式搜索,属于grep函数族,工作原理grep-E一样,其将模式视为扩展正则表达式,并打印出与模式匹配,如果有多个文件具有匹配模式,其还能显示每行文件名。...-F, --fixed-strings: 将PATTERN解释为固定字符串列表,用换行符分隔,这些字符串可以匹配。 -P, --perl-regexp: 将PATTERN解释为Perl正则表达式。...-H, --with-filename: 打印每个匹配项文件名。 -h, --no-filename: 当搜索多个文件时,禁止在输出中使用文件名前缀。 --help: 显示帮助文件。...这使调用进程能够继续(恢复)搜索,当grep在NUM个匹配之后停止时,它输出任何后面的上下文。当-c或--count选项也被使用时,grep不会输出大于NUM计数。...此选项可与find -print0、perl -0、sort -zxargs -0等命令一起使用,以处理任意文件名,即使是包含换行符文件名

    1.4K10

    Shell文本处理三剑客之grep

    (BRE) -P,--perl-regexp 模式是Perl正则表达式 -e,--regexp=PATTERN 使用模式匹配,可指定多个模式匹配 -f,--file=FILE 从文件每一获取模式 -i...描述 -m,--max-count=NUM 输出匹配结果num数 -n,--line-number 打印行号 -H,--with-filename 打印每个匹配文件名 -h,--no-filename...不输出文件名 -o,--only-matching 只打印匹配内容 -q,--quiet 不输出正常信息 -s, --no-messages 不输出错误信息 -r,--recursive --include...只搜索匹配文件。 跳过匹配文件。 跳过匹配文件,来自文件模式。...匹配de字符结尾并输出匹配 # echo "a ab abc abcd abcde" |xargs -n1 |grep -n 'de$' 5:abcde 11) 递归搜索/etc目录下包含ip

    45920

    Linux CPU 性能分析工具火焰图(Flame Graphs)认知

    函数栈帧一起看,图原点在左下方(一般图一样),表示[0,a]区间。 X轴上方块长度确实也有它意义:方块长度表示了该函数在剖析文件中出现次数比重。...其中一个特性是,当鼠标指针移动到相应栈帧上时,会有一信息显示出来,表明该栈帧在整个剖析文件中所占比例。 缩放 可以单击栈帧实现横向缩放’。这可将较窄栈帧展开放大,这样就能看到它们名字。...类似一个数据可视化中下转操作 搜索 使用搜索按钮,或者按 Ctr1+F 组合键,允许输入搜索关键词,命中会以洋红色高亮显示出来,同时显示搜索命中结果在所有堆栈中所占百分比。...这是在内核中使用eBPF映射来实现。只有唯一堆栈和它们计数被复制到用户级进行打印。.../flamegraph.pl 脚本时,Perl 解释器无法找到所需 open.pm 模块。该模块可能没有正确安装或没有包含在 Perl 解释器模块搜索路径中。

    1.4K11

    代码审计从0到1 —— Centreon One-click To RCE

    全局过滤数据后,程序引入公共类文件功能代码 ? 99$contreon变量在header.php中$session取出,认证是否登录 ?...调试发现formMibs.php中31$values["tmp_name"]是缓存文件名不可控,$manufacturerId可以通过上传数据包中mnftr字段修改,但是被filter_var()处理...虽然缓存文件名是不可控,但是上传mib文件内容可控,shell_exec()中执行命令实际为("xxx.mib"代表缓存文件名) /usr/share/centreon/bin/centFillTrapDB...use命令寻找路径默认在@INC下,但不知道具体在哪里,可以全局搜索一下 ?...把centFillTrapDB模块拉出来静态看一下,发现存在命令执行且内容可控位置,实际调试发现最终分支是进入541,540543是我添加调试代码 ?

    80720

    一天一个 Linux 命令(19):grep 命令

    ,它能使用正则表达式搜索文本,并把匹配打印出来。...若不指定任何文件名称,或是所给予文件名为 -,则 grep 指令会从标准输入设备读取数据。 grep工作方式是这样,它在一个或多个文件中搜索字符串模板。...如果模板包括空格,则必须被引用,模板后所有字符串被看作文件名搜索结果被送到标准输出,不影响原文件内容。...-h, --no-filename : 在显示符合字符那一之前,不标示该行所属文件名称。 -H, --with-filename : 在显示符合字符那一之前,表示该行所属文件名称。...-x, --line-regexp : 只显示全列符合列。 -y : 此参数效果指定"-i"参数相同。 四、命令功能 用于过滤/搜索特定字符。

    40310

    Perl语言程序应用(资料汇总版)

    Perl语言最初是为文件体系处理而创作一种多用途语言,Perl试图填补低级语言(如C、C++或汇编语言)高级语言(如shell编程)之间空白,使其既满足快速编程,又具有灵活文本处理功能。...\n"; } while循环中钻石操作符按读取参数文件并将内容存入$_,foreach循环中将外层中$_内容按空格进行拆分成列表并将每一部分依次存入内层$_,内层循环中标量变量哈希其初始值均为undef...home/tengwenkai/perl5/lib 不过一般不建议这么做,除非默认安装路径(可以使用perl-V查看,在@INC数组中)没有写入权限,否则在模块使用时就得添加完整路径或者修改默认搜索路径...在Perl中整合命令cpan可以显示默认搜索路径下安装所有模块,我们可以在其中查看已安装gzip模块,如下所示: 上述模块实际上是使用MakeMaker封装,使用Perl自带ExtUtils:...basename函数用于返回一个包含路径文件名基名(basename,也即去掉路径后文件名),如下所示: use File::Basename; my $name = '/usr/local/bin

    3.6K30

    Vim 命令、操作、快捷键(建议收藏)

    :set incsearch  逐步搜索模式,对当前键入字符进行搜索而不必等待键入完成。 :set wrapscan  重新搜索,在搜索到文件头或尾时,返回继续搜索,默认开启。...ddp 交换光标所在行其下紧邻。 移动命令 h 左移一个字符 l 右移一个字符,这个命令很少用,一般用w代替。...拷贝粘贴 yy 拷贝当前行 nyy 拷贝当前后开始n,比如2yy拷贝当前行及其下一。 p 在当前光标后粘贴,如果之前使用了yy命令来复制一,那么就在当前行下一粘贴。...perl -c script.pl 检查perl脚本语法,可以不用退出vim,非常方便。 :!perl script.pl 执行perl脚本,可以不用退出vim,非常方便。...注释命令 perl程序中#开始行为注释,所以要注释某些,只需在行首加入# 3,5 s/^/#/g 注释第3-5 3,5 s/^#//g 解除3-5注释 1,$ s/^/#/g 注释整个文档。

    1.2K10

    教程 | Vim 教程【命令-操作-快捷键】

    :set incsearch  逐步搜索模式,对当前键入字符进行搜索而不必等待键入完成。 :set wrapscan  重新搜索,在搜索到文件头或尾时,返回继续搜索,默认开启。...ddp 交换光标所在行其下紧邻。 移动命令 h 左移一个字符 l 右移一个字符,这个命令很少用,一般用w代替。...拷贝粘贴 yy 拷贝当前行 nyy 拷贝当前后开始n,比如2yy拷贝当前行及其下一。 p 在当前光标后粘贴,如果之前使用了yy命令来复制一,那么就在当前行下一粘贴。...perl -c script.pl 检查perl脚本语法,可以不用退出vim,非常方便。 :!perl script.pl 执行perl脚本,可以不用退出vim,非常方便。...注释命令 perl程序中#开始行为注释,所以要注释某些,只需在行首加入# 3,5 s/^/#/g 注释第3-5 3,5 s/^#//g 解除3-5注释 1,$ s/^/#/g 注释整个文档。

    61820

    138 条 Vim 命令、操作、快捷键全集

    :set incsearch  逐步搜索模式,对当前键入字符进行搜索而不必等待键入完成。 :set wrapscan  重新搜索,在搜索到文件头或尾时,返回继续搜索,默认开启。...ddp 交换光标所在行其下紧邻。 移动命令 h 左移一个字符 l 右移一个字符,这个命令很少用,一般用w代替。...拷贝粘贴 yy 拷贝当前行 nyy 拷贝当前后开始n,比如2yy拷贝当前行及其下一。 p 在当前光标后粘贴,如果之前使用了yy命令来复制一,那么就在当前行下一粘贴。...perl -c script.pl 检查perl脚本语法,可以不用退出vim,非常方便。 :!perl script.pl 执行perl脚本,可以不用退出vim,非常方便。...注释命令 perl程序中#开始行为注释,所以要注释某些,只需在行首加入# 3,5 s/^/#/g 注释第3-5 3,5 s/^#//g 解除3-5注释 1,$ s/^/#/g 注释整个文档。

    1K00

    vim 常用命令

    ddp 交换光标所在行其下紧邻。 移动命令 h 左移一个字符 l 右移一个字符,这个命令很少用,一般用w代替。...拷贝粘贴 yy 拷贝当前行 nyy 拷贝当前后开始n,比如2yy拷贝当前行及其下一。 p 在当前光标后粘贴,如果之前使用了yy命令来复制一,那么就在当前行下一粘贴。...正常模式下按v(逐字)或V(逐行)进入可视模式,然后用jklh命令移动即可选择某些或字符,再按y即可复制 ddp交换当前行其下一 xp交换当前字符其后一个字符 剪切命令 正常模式下按v...perl -c script.pl 检查perl脚本语法,可以不用退出vim,非常方便。 :!perl script.pl 执行perl脚本,可以不用退出vim,非常方便。...注释命令 perl程序中#开始行为注释,所以要注释某些,只需在行首加入# 3,5 s/^/#/g 注释第3-5 3,5 s/^#//g 解除3-5注释 1,$ s/^/#/g 注释整个文档

    1.4K21

    Linux locate命令使用方法

    命令概述 locate命令其实是find -name另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/locatedb,这个数据库中含有本地所有文件信息。...-A, --all 只显示匹配所有模式条目 -b, --basename 匹配唯一路径名称基本文件名 -c, --count 只显示找到条目的号码 -d, --database...sh开头文件 [root@localhost ~]# locate /bin/sh /home/oracle/app/oracle/product/11.2.0/dbhome_1/perl/bin/...REGEXP 来代替模式 当需要查找符合特定规则信息时,可以使用 -r 选项匹配相应正则表达式。...localhost test]$ locate -S 数据库 /var/lib/mlocate/mlocate.db: 18,935 文件夹 231,751 文件 13,753,723 文件名字节数

    2.2K21
    领券