0

我不经常编写 bash 脚本,所以请原谅我的无知。我有一个逐行读取的日志文件。根据前 4 个字符,我操作字符串并重写为清理后的文件。在极少数情况下,我不知道会有多少列。最初,我使用了以下内容,然后才意识到 20,000+ 行日志文件中有超过 7 列:

echo $line | awk '{split($0,a," "); print a[3] " " a[4] " " a[5] " " a[6] " " a[7]}' >> $filename

…产生如下输出: Hello world, I need vacation

我现在可以提取所有需要的信息,但它写成一个列表:

echo $line | awk '{split($0,a," "); for(i=3;i<=NF;i++) print a[i]}' >> $filename

…生产:

Hello  
world,  
I  
need  
vacation  

使用帖子“使用 awk 打印从第 n 个到最后一个的所有列”(除其他外),我尝试将 cat、svn 以及其他东西混在一起,但语法不正确。我喜欢将上面的 awk 部分替换为:

awk '{out=""; for(i=2;i<=NF;i++){out=$out" "$i}; print $out}'

但我显然不明白规则。

提前感谢您的帮助!

4

2 回答 2

2

相反呢cut

echo "1 2 3 4 5" | cut -d ' ' -f 3-

输出:

3 4 5
于 2014-05-28T16:19:35.073 回答
0

昨天有人发帖,但在我回过头来打勾之前就被删除了(谢谢你,陌生人!)。使用awk,帖子说:

awk '{for(i=3;i<=NF;i++) printf "%s%s", $i,(i==NF?RS:FS)}' <<< "$line" >> "$文件名”

说明: (i==NF?RS:FS) 是一个三元测试条件——如果是最后一个字段,则使用 RS(默认情况下,记录分隔符和换行符);否则使用 FS(字段分隔符,默认为空格)。

于 2014-05-29T13:56:21.370 回答