2012-03-28 22 views
1

從下面的命令如何可以消除所有之前消除不需要的輸出使用AWK和sed

Owner  RepoName    CreatedDate 

EDIT命令時發生的行:

find /opt/site/ -name '.log.txt' | xargs cat | awk '{$NF=""; print $0}' | sed '1i Owner RepoName CreatedDate' | column -t 

輸出是

find: Filesystem loop detected; `/nfs/.snapshot/nightly.4' has the same device number and inode as a directory which is 2 levels higher in the filesystem hierarchy. 
find: Filesystem loop detected; `/nfs/.snapshot/nightly.5' has the same device number and inode as a directory which is 2 levels higher in the filesystem hierarchy. 
find: Filesystem loop detected; `/nfs/.snapshot/nightly.6' has the same device number and inode as a directory which is 2 levels higher in the filesystem hierarchy. 
Owner  RepoName    CreatedDate 
val  abc     Fri   Mar 16 17:01:07 PDT 
p1   repo_pc    Wed   Mar 21 11:34:42 PDT 
New  fm     Mon   Mar 19 00:15:51 PD 

要求的輸出僅爲:

Owner  RepoName    CreatedDate 
val  abc     Fri   Mar 16 17:01:07 PDT 
p1   repo_pc    Wed   Mar 21 11:34:42 PDT 
New  fm     Mon   Mar 19 00:15:51 PD 

回答

3

那些發現錯誤將在stderr上,所以完全繞過你的鏈條,你會想用2>/dev/null重定向錯誤,儘管這會阻止你在find命令中看到任何其他錯誤。

find /opt/site/ -name '.log.txt' 2>/dev/null | xargs cat | awk '{$NF=""; print $0}' | xargs sed "/Filesystem/d" | sed '1i Owner RepoName CreatedDate' | column -t 

一般來說,像這樣一個複雜的命令,你應該打破它,當你有錯誤,以便能與您攜手哪裏出了問題的來源。

讓我們分手了這個命令,看看它在做什麼:

find /opt/site/ -name '.log.txt' 2>/dev/null - 找到的所有文件在/ opt /網站/命名.log.txt

xargs cat - 讓他們的所有內容,一前一後其他

awk '{$NF=""; print $0}' - 刪除最後一列

xargs sed "/Filesystem/d" - 對待每個條目作爲文件並刪除從那些中的內容文件系統包含任何線文件。

sed '1i Owner RepoName CreatedDate' - 插入業主RepoName CreatedDate第一行

column -t - 給定的數據轉換成表格

我建議建立的命令,並檢查輸出是在每個階段正確的。

有幾件事情是令人驚訝你的命令:

  1. 將找到一個尋找那些恰好.log.txt而不是擴展名的文件。
  2. 第二次xargs調用 - 將.log.txt文件的內容轉換爲文件名。
+0

2>的/ dev/null的還是不工作.. ....... – Rajeev 2012-03-28 09:31:57

+0

模糊輸出重定向。 – Rajeev 2012-03-28 09:33:45

+0

@Rajeev可能你使用的是不是'bash'的shell? – 2012-03-28 09:38:16

0

在第一個管道之前,您可以通過將2>/dev/null追加到您的查找部分命令中,從而消除find的錯誤輸出。 [編輯:這是最好的方式,我已經投票道格拉斯',因爲他在這裏第一;)]

但是,如果你真的想用sed或awk(想不到爲什麼?),你可以修改你的awk腳本跳過開頭行「發現:」:

awk '/^find:/ {next;} {$NF=""; print $0}' 
+0

我仍然保持相同的輸出爲你所建議的 – Rajeev 2012-03-29 07:13:22

0

可悲的是,你似乎可以用csh或tcsh,其中從重定向標準輸出單獨的標準誤差是困難的。否則道格拉斯的答案會奏效。但試試這個:

(find /opt/site/ -name '.log.txt' | xargs cat | awk '{$NF=""; print $0}' | sed '1i Owner RepoName CreatedDate' | column -t > output) >&/dev/null 

注意圍繞大部分命令的parens。在這些parens中,重定向是將標準輸出發送到名爲「output」的文件,而不是發送到您的終端(將其命名爲任何您想要的名稱),或者如果您真的想在終端中看到它,則將output替換爲/dev/tty。在這些元素之外是一個重定向,將剩餘的錯誤消息發送到/dev/null

整個事情是對可怕的貝殼壽命的悲慘評論。

0

sed接着命令應該做的工作(與輸入文件中或從管使用它):

sed -n '/^Owner/,$ p' 

說明:

-n    # Disable auto-print. 
/^Owner/  # From a line beginning with 'Owner'... 
$    # ...until end of input... 
p    # print