根据某些搜索条件替换文件中的字符串是一项非常常见的任务。我怎样才能
foo用bar在当前目录下的所有文件?我有一个包含大型 csv 文件的目录和子目录列表。这些文件大约有 5 亿行,每一行都是一条记录。我想知道
最重要的是,我需要“人类可读的格式”,例如。12,345,678 而不是 12345678
学习如何以 3 种方式做到这一点会很好。普通的 bash 工具、awk 等,以及 perl(或 python)。
File1 内容:
line1-file1 "1"
line2-file1 "2"
line3-file1 "3"
line4-file1 "4"
Run Code Online (Sandbox Code Playgroud)
File2 内容:
line1-file2 "25"
line2-file2 "24"
Pointer-file2 "23"
line4-file2 "22"
line5-file2 "21"
Run Code Online (Sandbox Code Playgroud)
perl/shell脚本执行后,File2内容应该变成:
line1-file2 "25"
line2-file2 "24"
line1-file1 "1"
line2-file1 "2"
line3-file1 "3"
line4-file1 "4"
Pointer-file2 "23"
line4-file2 "22"
line5-file2 "21"
Run Code Online (Sandbox Code Playgroud)
即File1在File2包含“指针”的行之前粘贴in的内容。
在 Perl 文档中,perlrun(1)建议使用双语 shell/Perl 头文件启动 Perl 脚本:
#!/bin/sh
#! -*-perl-*-
eval 'exec perl -x -wS $0 ${1+"$@"}'
if 0;
Run Code Online (Sandbox Code Playgroud)
什么${1+"$@"}意思?我尝试"$@"改用(使用 Bash 作为 /bin/sh),它似乎也能正常工作。
下面的两个答案说它应该是${1:+"$@"}. 我知道${parameter:+word}bash(1) 中记录的(“使用替代值”)语法。然而,我不相信,因为
无论${1+"$@"}和"$@"工作得很好,即使在没有参数。如果我创建 simple.sh 作为
#!/bin/sh
eval 'exec /usr/bin/perl -x -S -- $0 "$@"'
if 0;
#!perl
use Data::Dumper;
print Dumper(\@ARGV);
Run Code Online (Sandbox Code Playgroud)
和 question.sh 作为
#!/bin/sh
eval 'exec /usr/bin/perl -x -S -- $0 ${1+"$@"}'
if 0;
#!perl
use Data::Dumper;
print Dumper(\@ARGV);
Run Code Online (Sandbox Code Playgroud)
我可以让两者以相同的方式工作: …
注意:这个问题是这个问答的补充:如何在给定范围内“grep”行长度*不*?
我只需要从长度范围为最小或等于 3 个字符但不长于或等于 10 的文本文件(一个单词列表,用换行符分隔)中获取行。
例子:
输入:
egyezményét
megkíván
ki
alma
kevesen
meghatározó
Run Code Online (Sandbox Code Playgroud)
输出:
megkíván
alma
kevesen
Run Code Online (Sandbox Code Playgroud)
问题:我怎样才能做到这一点bash?
使用像 sed 或 awk 这样的常用命令行工具,是否可以连接以给定字符结尾的所有行,如反斜杠?
例如,给定文件:
foo bar \
bash \
baz
dude \
happy
Run Code Online (Sandbox Code Playgroud)
我想得到这个输出:
foo bar bash baz
dude happy
Run Code Online (Sandbox Code Playgroud) 来自 Windows 管理,我想更深入地研究 Linux (Debian)。我在网上搜索(没有找到)时无法回答的一个紧迫问题是:如何像在 Windows PowerShell 中那样实现所谓的“一对多”远程处理?
为了将其分解为基础知识,我会说:
我对 Linux 的看法:
我在 Windows 上的经验:
我输入我的命令并使用“invoke-command”我可以将其“发送”到一堆服务器(可能来自文本文件)以同时执行并返回结果(作为进一步工作的对象)。
我什至可以建立多个会话,连接在后台保持,并有选择地向这些会话发送命令,并根据需要远程进出。
(我听说过厨师、木偶等。是这样的吗?)
Update 2019:
在尝试了很多之后 - 我建议Rex(见下面的评论) - 简单的设置(实际上它只需要 ssh,没有别的)和使用(如果你知道一点点perl,它会更好,但它是可选的)
与Rex(ify) )您可以执行adhoc命令并将其推进到真正的配置管理中(...意思是:它首先是一个 CM,但也适用于临时任务)网站接缝已过时,但目前(截至 01/2019)它正在积极开发中,IRC 频道也处于活跃状态。
有了 Windows 的新openssh,还有更多的可能性
你可以试试:
rex -u user -p password -H 192.168.1.3 -e 'say run "hostname"'
我有许多大型 CSV 文件,并希望它们采用 TSV(制表符分隔格式)。复杂的是CSV文件的字段中有逗号,例如:
A,,C,"D,E,F","G",I,"K,L,M",Z
Run Code Online (Sandbox Code Playgroud)
预期输出:
A C D,E,F G I K,L,M Z
Run Code Online (Sandbox Code Playgroud)
(中间的空格是“硬”标签)
我在这台服务器上安装了 Perl、Python 和 coreutils。
当我执行 'top' 时,我看到我的 perl 脚本进程处于 'S' 状态。有没有办法知道,是什么让这个 perl 进程进入睡眠状态以及唤醒它的方法?任何调试方法以提供有关 perl 脚本中行的更多见解,使其进入“S”状态。
显然,运行:
perl -n -e 'some perl code' *
Run Code Online (Sandbox Code Playgroud)
或者
find . ... -exec perl -n -e '...' {} +
Run Code Online (Sandbox Code Playgroud)
(与-p代替相同-n)
或者
perl -e 'some code using <>' *
Run Code Online (Sandbox Code Playgroud)
经常在本网站上发布的 one-liners 中发现,具有安全隐患。这是怎么回事?如何避免?