簡體   English   中英

從文件讀取 bash Linux

[英]Reading from file bash Linux

我很難使用以下 bash 腳本:

基本上,腳本所做的是接收一個目錄,然后在目錄中的所有文件夾中搜索以.log 結尾的文件。 之后,它應該將這些文件中按寫入日期排序的所有行打印到標准輸出。

我的腳本是這樣的:

#!/bin/bash

find . -name ".*log" | cat *.log |  sort --stable --reverse --key=2,3

當我運行腳本時,它會返回列表,但排序無法正常工作。 我的猜測是因為在某些文件中有 \n 這使它開始一個新行。

有沒有辦法忽略文件中的 \n 而仍然讓每一行返回一個新行?

謝謝你! 我們應該得到的輸出 當前輸出結果 文件中的文本

xxd 命令 output:

ise@ise-virtual-machine:~$ xxd /home/ise/Downloads/f1.log 00000000: 3230 3139 2d30 382d 3232 5431 333a 3333 2019-08-22T13:33 00000010: 3a34 342e 3132 3334 3536 3738 3920 4865:44.123456789 He 00000020: 6c6c 6f0a 576f 726c 640a 0032 3032 302d llo.World..2020- 00000030: 3031 2d30 3154 3131 3a32 323a 3333 2e31 01-01T11:22:33.1 00000040: 3233 3435 3637 3839 206c 6174 650a 23456789 late. ISE@ISE-VIRTUAL-MACHINE:〜$ xxd/home/ise/downloads/f2.log 00000000:3230 3139 2D30 392D 392D 3434 5431 333A 343A 3434 2019-09-09-44T13:44 Si 00000020: 6d70 6c65 206c 696e 650a 多線。 ise@ise-virtual-machine:~$ xxd /home/ise/Downloads/f3.log 00000000: 3230 3139 2d30 382d 3232 5431 333a 3333 2019-08-22T13:33 00000010: 3a34 342e 3132 3334 3536 3738 3920 4865:44.123456789 He 00000020: 6c6c 6f0a 576f 726c 6420 320a 0032 3032 llo.World 2..202 00000030: 302d 3031 2d30 3154 3131 3a32 323a 3333 0-01-01T11:22:33 00000040: 2e31 3233 3435 3637 3839 206c 6174 6520.123456789 late 00000050: 320a 2.

鑒於日志文件中的條目以 \0 (NUL) 結尾,find、sed 和 sort 可以結合使用:

find . -name '*.log' | xargs sed -z 's/\n//g' | sort -z --key=2,3 --reverse

假設文件中的每條記錄都以日期開頭並且--key=2,3選項,請嘗試:

find . -name "*.log" -exec cat '{}' \; | sort -z | xargs -I{} -0 echo "{}"

最后的命令xargs.. echo..將是正確打印空終止行所必需的。
如果您仍然需要--key選項,請根據需要修改代碼。 我不知道這些線條現在的樣子。

[更新]

根據 OP 提供的信息,我假設日志文件的格式為:

  • 每條記錄都以"yyyy-mm-ddTHH:MM:SS.nanosec"格式的日期開頭,並且可以應用簡單的字典順序排序。
  • 每條記錄都以"\n\0"結尾,但文件的最后一條記錄僅以"\n"結尾。
  • 每個記錄可能在中間包含換行符作為記錄的一部分,用於行折疊目的。

那么怎么樣:

find . -name "*.log" -type f -exec cat "{}" \; -exec echo -ne "\0" \; | sort -z
  • echo -ne "\0"將 null 字符附加到文件的最后一條記錄。 否則該記錄將被合並到另一個文件的下一條記錄。
  • 用於sort-z選項將 null 字符視為記錄分隔符。
  • 到目前為止,不需要其他sort選項。

OP 發布輸入的結果:

2019-08-22T13:33:44.123456789 Hello
World
2019-08-22T13:33:44.123456789 Hello
World 2
2019-09-44T13:44:21.987654321 Simple line
2020-01-01T11:22:33.123456789 late
2020-01-01T11:22:33.123456789 late 2

它仍然在每條記錄的末尾保留 null 字符"\0" 如果要修剪它,請在管道末尾添加tr -d "\0"命令:

find . -name "*.log" -type f -exec cat "{}" \; -exec echo -ne "\0" \; | sort -z | tr -d "\0"

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM