Ins*_*420 8 command-line text-processing
我有一个包含我保存的数据的文件。现在我想将我的结果打印到一个新文件中。
例如,让我们以这个例子为例randomlog.log:
Link encap:Ethernet HWaddr 08:00:00:00:00:67
inet addr:10.10.10.10 Bcast:10.10.10.10 Mask:255.255.255.0
inet6 addr: fe80::casf:sdfg:23ra:dg12/64 Scope:Link
Run Code Online (Sandbox Code Playgroud)
如何只取第一行第 12 到 20 个字符的数据,然后取第三行的第 4 到第 8 个字符?输出看起来像这样:
Ethernet
t6 ad
Run Code Online (Sandbox Code Playgroud)
这可能吗?我想设置线和从位置到这个位置。
这是一个sed方法:
$ sed -nE '1s/.{11}(.{8}).*/\1/p; 3s/.{3}(.{4}).*/\1/p' file
Ethernet
t6 a
Run Code Online (Sandbox Code Playgroud)
该-n禁止常规输出(正常是打印每个输入线)时告知,使其只打印。在-E启用扩展正则表达式。
该sed脚本有两个命令,都使用替换运算符 ( s/original/replacement/)。该1s/.{11}(.{8}).*/\1/p会一号线(这是唯一的运行1s一样),并且将匹配1号线的11个字符(.{11}),然后将其抓住下一个8( (.{8}),括号是一个“捕获组”),然后一切,直到行尾 ( .*)。所有这些都被捕获组中的任何内容替换(\1;如果有第二个捕获组,它会是\2等等)。最后,p末尾的 ( s/foo/bar/p) 导致在进行替换后打印该行。这导致仅输出目标 8 个字符。
第二个命令是相同的总体思路,只是它只会在第 3 行 ( 3s)上运行,并将保留从第 4 行开始的 4 个字符。
你也可以做同样的事情perl:
$ perl -ne 'if($.==1){s/.{11}(.{8}).*/\1/}
elsif($.==3){s/.{3}(.{4}).*/\1/}
else{next}; print; ' file
Ethernet
t6 a
Run Code Online (Sandbox Code Playgroud)
的-ne意思是“逐行读取输入文件中的行,并申请给出的脚本-e到每一行。该脚本是相同的基本想法之前该$.变量保存当前的行号,以便我们检查,如果行号或者是1或3,如果所以,运行替换,否则跳过。因此print将只对这两行运行,因为所有其他行都将被跳过。
当然,这是 Perl,所以TIMTOWTDI:
$ perl -F"" -lane '$. == 1 && print @F[11..19]; $.==3 && print @F[3..6]' file
Ethernet
t6 a
Run Code Online (Sandbox Code Playgroud)
这里的-a意思是“在 给定的字符上分割每个输入行-F并保存为数组@F。由于给定的字符为空,这将把输入行的每个字符保存为 中的一个元素@F。然后,我们打印元素 11-19 (数组从0)开始计数,第 1 行,第 3-7 行。