如何在shell中使用 sed 或任何其他过滤器
假设我在两个变量$line1
和$line2
中有两个特定的行号,我想在这两行中提取这样的行
cat my_file_path | command $line1 $line2
示例,如果我的文件是:
1:BBB
2:CCCC
3:DDDD
4:EEEEE
如果我这样做,我的输出应该是:
cat my_file_path | command 1 3
输出
bbb
cccc
答案 0 :(得分:9)
使用sed:
$ cat my_file_path | sed -n "${line1},${line2}p"
或者,甚至更好(cat
在某种程度上是多余的):
$ sed -n "${line1},${line2}p" my_file_path
答案 1 :(得分:5)
未经测试:
awk -v s="$line1" -v e="$line2" 'NR>s&&NR<e' file
您可以使用>= or <=
如果你想让shell var中的前导/尾随空格安全:
awk -v s="$line1" -v e="$line2" 'NR>1*s&&NR<1*e' file
答案 2 :(得分:4)
您可以使用尾部和头部的管道
tail -n +$line1 | head -n $((line2-line1))
答案 3 :(得分:0)
这是我在Centos上使用的示例,此示例从 myFile.log
打印100至200行 awk 'NR >= 100 && NR <= 200' myFile.log
100之前的其他示例行
awk 'NR <= 100' fileName.log
请注意,您还可以使用>,<比较器。
对于更复杂的情况,此答案使用NR变量aka记录号(如行号),对于更复杂的情况,您可以查看AWK内置变量:https://www.thegeekstuff.com/2010/01/8-powerful-awk-built-in-variables-fs-ofs-rs-ors-nr-nf-filename-fnr/
希望有帮助
答案 4 :(得分:0)
使用awk:
awk 'NR==100, NR==200' myfile.log
awk 'NR==100, NR==200; NR==200 {exit}' myfile.log # optimized
第二个程序具有优化功能,它会在打印所需范围的最后一行之后退出。
使用了范围模式:
范围模式由两个用逗号分隔的模式组成,格式为“ begpat,endpat”。它用于匹配连续输入记录的范围。
https://www.gnu.org/software/gawk/manual/html_node/Ranges.html
模式可以是 regexp模式或表达模式。上面使用表达模式与NR进行比较。
答案 5 :(得分:0)
使用 sed 打印(仅!)100 和 200 之间的行:
sed '1,100d;200,$d' file
优化:遇到范围结束时退出。
sed -n '1,100b;200q;p' file
优化使用 b
命令:
b
– 无条件分支(即:总是跳转到一个标签,跳过
或重复其他命令,而不重新开始新的循环)
[...] 如果省略了标签,分支命令将重新开始循环。
GNU sed manual: branching and flow control
测试优化是否有效。
seq 1 100000 > file # A file with 10,000 lines
echo
echo "Without optimization:"
time sed '1,100d;200,$d' file >/dev/null
echo
echo "With optimization:"
time sed -n '1,100b;200q;p' file >/dev/null
输出:
Without optimization:
real 0m0.004s
user 0m0.003s
sys 0m0.001s
With optimization:
real 0m0.001s
user 0m0.000s
sys 0m0.001s