2013-08-27 17 views
-1

基本上我試圖比較兩個文件(一個從PC轉換.cpio文件到使用標準工具的佈局格式和另一個從使用busybox工具的嵌入式設備),它們都以'ls -l'格式生成文件系統文件/目錄佈局。但是我現在得到的問題是嵌入式設備的輸出打印了一些尺寸信息的目錄,該信息不存在.cpio。如何在Linux輸出中替換列數據 - 可能使用awk sed等

因此,我決定替換大小列的0字節大小的目錄內容行。從設備

輸出: - 從PC

drwxrwxr-x 2 root  root   5512 Aug 22 2013 bin 
lrwxrwxrwx 1 root  root    7 Aug 22 2013 bin/addgroup -> busybox 
lrwxrwxrwx 1 root  root    7 Aug 22 2013 bin/adduser -> busybox 
lrwxrwxrwx 1 root  root    7 Aug 22 2013 bin/ash -> busybox 

輸出: -

drwxrwxr-x 2 root  root   0 Aug 22 09:32 bin 
lrwxrwxrwx 1 root  root   7 Aug 22 09:24 bin/addgroup -> busybox 
lrwxrwxrwx 1 root  root   7 Aug 22 09:24 bin/adduser -> busybox 
lrwxrwxrwx 1 root  root   7 Aug 22 09:24 bin/ash -> busybox 

通過比較輸出我有兩個問題進行修復。

1)目錄大小顯示不正確,我想用awk/sed在設備端用'0'代替它。

2)同樣'09:32'時間需要替換爲'2013',如果我知道如何做第一我會自己做第二。

請分享您的想法來解決這個問題。

+3

'請分享你的想法來解決這個問題。' - 非常好的方式說'請爲我做這個'。 – devnull

+0

如果您規範化輸出並忽略中間列,那麼這兩個片段都是相同的。 –

+0

@devnull,我真的想自己解決這個問題,但我不是awk/sed專家。我在按需基礎上研究這些工具,我已經嘗試了幾頁在stackoverflow仍然我不明白如何解決這個問題,因此我要求用戶來幫助我。你將這個問題標記爲無用並不能真正解決我的問題,或者任何會遇到同樣問題的人。儘管我在這裏問過這個問題,但我仍然在努力解決這個問題。如果你不能幫助我,不要傷害我。有心的人可能會出面幫助我。 – rajeshk

回答

2
$ cat foo.input 
drwxrwxr-x 2 root  root   5512 Aug 22 2013 bin 
lrwxrwxrwx 1 root  root    7 Aug 22 2013 bin/addgroup -> busybox 
lrwxrwxrwx 1 root  root    7 Aug 22 2013 bin/adduser -> busybox 
lrwxrwxrwx 1 root  root    7 Aug 22 2013 bin/ash -> busybox 

$ cat foo2.input 
drwxrwxr-x 2 root  root   0 Aug 22 09:32 bin 
lrwxrwxrwx 1 root  root   7 Aug 22 09:24 bin/addgroup -> busybox 
lrwxrwxrwx 1 root  root   7 Aug 22 09:24 bin/adduser -> busybox 
lrwxrwxrwx 1 root  root  12345 Aug 22 09:24 bin/ash -> busybox 

$ diff <(awk '/^d/{$5=0}{$6=$7=$8=""}1' foo.input) <(awk '/^d/{$5=0}{$6=$7=$8=""}1' foo2.input) 
4c4 
< lrwxrwxrwx 1 root root 7 bin/ash -> busybox 
--- 
> lrwxrwxrwx 1 root root 12345 bin/ash -> busybox 
  • /^d/{$5=0}集字段(列)5至0如果線路匹配^d
  • {$6=$7=$8=""}因爲要忽略刪除字段6,7,8爲所有行(=與d =目錄開始)在輸出的日期
  • 打印效果和diff它們的輸出
+0

對不起,我需要該專欄來比較我的重要信息來檢查。 – rajeshk

+0

@ rk.infotek.ltd更新我的答案以反映這一點。 –

1

保留間隔:

$ awk ' 
    BEGIN{ preRE="^([^[:space:]]+[[:space:]]+){4}" } 
    /^d/{ 
     match($0,preRE) 
     preLgth=RLENGTH 

     match($0,preRE "[^[:space:]]+") 
     strLgth=RLENGTH-preLgth 

     $0 = substr($0,1,preLgth) sprintf("%*s",strLgth,0) substr($0,preLgth+strLgth+1) 
    } 
    1 
' file 
drwxrwxr-x 2 root  root    0 Aug 22 2013 bin 
lrwxrwxrwx 1 root  root    7 Aug 22 2013 bin/addgroup -> busybox 
lrwxrwxrwx 1 root  root    7 Aug 22 2013 bin/adduser -> busybox 
lrwxrwxrwx 1 root  root    7 Aug 22 2013 bin/ash -> busybox