是否可以通过 cli 从 csv 打印参数的迭代范围? (参见示例)

是否可以通过 cli 从 csv 打印参数的迭代范围? (参见示例)

我有数百条日志分布在几千个虚拟机上,我正在尝试创建一些脚本来快速扫描日志,我已经弄清楚了演示文稿的大部分内容,并想知道是否有一种简单的方法使用 awk 之类的东西,我知道如何使用 printf 等,但专门用于打印日志文件中的迭代值范围?

例子:

awk -F, '{printf $(1..5)}' huge_log_file.csv
column1 column2 column3 column4 column5
etc.

我知道如何正确地 awk、格式化、分离等打印输出,但我认为如果我可以指定我希望打印的一系列字段,那就太好了。

如果我弄清楚如何使用建议的类似问题和/或自己解决问题,我将更新我的问题。

谢谢!

编辑:我知道如何手动打印 $1 $2 $3 但没有将其包含在我的示例中

编辑2:我还知道如何使用 NF 来计算 awk 的字段数量,以便稍后使范围动态化,这是我的长期目标。

答案1

以第一个字段开始的范围

让我们考虑这个测试文件:

$ cat input.csv
a,b,c,d,e,f,g,h,i,j

至少使用 GNU awk,我们可以打印前五个(或其他数量)的字段,如下所示:

$ awk -F, '{NF=5; print}' OFS=, input.csv
a,b,c,d,e

对于那些重视简洁而不是清晰的人来说,我们可以等效地写:

$ awk -F, '{NF=5;} 1' OFS=, input.csv
a,b,c,d,e

动态调整大小

要忽略最后 2 个字段,无论这两个字段之前有多少个字段:

$ awk -F, '{NF-=2; print}' OFS=, input.csv
a,b,c,d,e,f,g,h

其他范围

要打印任意字段的开始和停止,则需要一个循环:

$ awk -v first=3 -v last=6 -F, '{for (i=first;i<=last;i++) printf "%s%s",$i,(i==last?ORS:OFS)}' OFS=, input.csv
c,d,e,f

要从第三个字段打印并动态保留最后两个字段:

$ awk -v first=3 -F, '{last=NF-2; for (i=first;i<=last;i++) printf "%s%s",$i,(i==last?ORS:OFS)}' OFS=, input.csv
c,d,e,f,g,h

答案2

只是简单说一下;awk更加灵活,但如果您想要的只是特定范围的字段,请使用cut

cut -d, -f1-5 huge_log_file.csv

awk如果这就是您所需要的,那么这比循环简单得多。

相关内容