如何在shell中使用sed或任何其他过滤器
假设我在两个变量中有两个特定的行号$line1,$line2并且我想在这两行中提取这样的行
cat my_file_path | command $line1 $line2
Run Code Online (Sandbox Code Playgroud)
示例如果我的文件是:
1:BBB
2:CCCC
3:DDDD
4:EEEEE
如果我这样做,我的输出应该是:
cat my_file_path | command 1 3
Run Code Online (Sandbox Code Playgroud)
产量
bbb
cccc
Run Code Online (Sandbox Code Playgroud)
Mih*_*hai 10
使用sed:
$ cat my_file_path | sed -n "${line1},${line2}p"
Run Code Online (Sandbox Code Playgroud)
或者,甚至更好(cat在某种程度上是多余的):
$ sed -n "${line1},${line2}p" my_file_path
Run Code Online (Sandbox Code Playgroud)
小智 7
您可以使用尾巴和头部的管道
tail -n +$line1 | head -n $((line2-line1))
Run Code Online (Sandbox Code Playgroud)
未经测试:
awk -v s="$line1" -v e="$line2" 'NR>s&&NR<e' file
Run Code Online (Sandbox Code Playgroud)
您可以通过以下方式控制“包含/排除” >= or <=
如果您想使其在shell变量中的前导/尾随空格安全,请执行以下操作:
awk -v s="$line1" -v e="$line2" 'NR>1*s&&NR<1*e' file
Run Code Online (Sandbox Code Playgroud)
这是我在 Centos 上使用的,此示例从myFile.log打印 100 到 200 之间的行
awk 'NR >= 100 && NR <= 200' myFile.log
Run Code Online (Sandbox Code Playgroud)
100 之前的其他示例行
awk 'NR <= 100' fileName.log
Run Code Online (Sandbox Code Playgroud)
请注意,您还可以使用 >,< 比较器。
对于更复杂的场景,此答案使用 NR 变量又名记录号,例如行号您可以查看 AWK 内置变量:https : //www.thegeekstuff.com/2010/01/8-powerful-awk-built- in-variables-fs-ofs-rs-ors-nr-nf-filename-fnr/
希望能帮助到你