2011-06-27 46 views
1

我有下面的輸出如何省略使用正則表達式

 
Filesystem   1K-blocks  Used Available Use% Mounted on 
/dev/sda3    60300484 18883824 38304156 34%/
/dev/sda1    1046516  8604 1037912 1% /boot/efi 
tmpfs     4120800   0 4120800 0% /dev/shm 
psnfs1:/SDepot  629145600 400663744 228481856 64% /depot 
psnfs1:/vol/ghome/ghome/support/kumar 
        1287651328 1065510400 222140928 83% /home/kumar 
psnfs2:/vol/us_nhome2/us_nishome2/shaw 
        1073741888 799816192 273925696 75% /home/shaw 
psnfs2:/vol/us_nhome2/us_nishome2/asimon 
        1073741888 799816192 273925696 75% /home/asimon 

當我使用(?xms)(^[/\w:]+.*?)(?=^[/\w:]+|\Z)讓每一行,後來我用\s從分組中提取每一列的值在LinuxIA64的DF -k命令標題正則表達式輸出,但問題是我也得到標題(Filesystem 1K-blocks Used Available Use% Mounted on)。我怎樣才能省略它們?還解釋了正則表達式,請:)謝謝

回答

1

如果你正在建設成爲一個管道這一點,很可能會更易於使用tail(1)比建設一個更復雜的正則表達式:

$ df -k 
Filesystem   1K-blocks  Used Available Use% Mounted on 
/dev/sda3    11811504 7979960 3231544 72%/
none     3054508  300 3054208 1% /dev 
... 

VS

$ df -k | tail -n+2 
/dev/sda3    11811504 7979960 3231544 72%/
none     3054508  300 3054208 1% /dev 
none     3061428  596 3060832 1% /dev/shm 
... 

tail(1)手冊頁:

-n, --lines=K 
      output the last K lines, instead of the last 10; or 
      use -n +K to output lines starting with the Kth 

如果是我的話,我可能會使用awk(1)去特定的列:

$ df -k |tail -n+2 | awk '{print $5, $6;}' 
72%/
1% /dev 
1% /dev/shm 
1% /var/run 
0% /var/lock 
72% /var/lib/ureadahead/debugfs 
59% /boot 
34% /home 
+0

我不知道tail'如何AWK的作品,但'很不錯,以備將來參考你能解釋一下我關於'awk'的一點點?感謝您的回答:) – abi1964

+1

@Abhishek,'awk'是一種標準語言,可以使一些常見的面向文本的作業變得更加簡單。它採用匹配的規範和代碼塊,並在匹配正則表達式的輸入_records_上執行代碼塊。我的最後一個例子也可以寫成'df -k | awk'/ \ // {print $ 5,$ 6;}'' - 正則表達式'/ \ //'在記錄中的任何位置(默認行)匹配單個'/',然後打印第五個和第六個字段。雖然'awk'可以用來編寫非常複雜的程序,但我比較喜歡短的單行程序 - 比這更長,並且與Perl,Ruby,Python相比,它會變得很難閱讀。 – sarnold

+0

感謝看看一些嘖嘖:) – abi1964