2017-06-22 88 views
1

我試圖使用正則表達式來解析從PSFTP中的dir命令生成的日誌文件。PSFTP如何使用RegExp從Dir命令獲取文件名

例迪爾例如1

drwxr-xr-x 1 0  0     0 Jun 21 13:13 . 
drwxr-xr-x 1 0  0     0 Jun 21 13:13 .. 
-rw-r--r-- 1 0  0    897 Jun 20 15:02 EQA.txt 
-rw-r--r-- 1 0  0    897 Jun 20 15:06 EQA1.txt 
-rw-r--r-- 1 0  0    897 Jun 16 20:41 Test.txt 
-rw-r--r-- 1 0  0    897 Jun 16 21:46 Test1.txt 
-rw-r--r-- 1 0  0    897 Jun 21 13:13 Test4.txt 
-rw-r--r-- 1 0  0    913 May 31 18:01 test.123456789.txt 
psftp> bye 

例迪爾例如2

drwx------ 2 MikePC-apps users  4096 Apr 5 2016 . 
drwx------ 4 MikePC-apps users  4096 Jan 20 2016 .. 
-rw-r--r-- 1 MikePC-apps users   82 Apr 5 2016 test.txt.$01 
-rw-r--r-- 1 MikePC-apps users   82 Aug 10 2016 test.txt.$02 
-rw-r--r-- 1 MikePC-apps users   82 Aug 10 2016 test.txt.asc 
-rw-r--r-- 1 MikePC-apps users   82 Aug 10 2016 test1.txt.$01 
-rw-r--r-- 1 MikePC-apps users  1927 Apr 4 2016 test.zip 
從我發現周圍淨,如果文件是6個月以上或在未來

所以,今年在當天顯示而不是時間。

例如1,我使用正則表達式:/d/d/s .*.*.*後跟子字符串函數來檢索文件名。

但我不知道如何處理第二個例子。我希望也許有一個dir命令的參數包含時間戳,所以我可以使用相同的正則表達式。或者也許有另一個正則表達式可以處理這兩個示例。

非常感謝!

回答

0

嘗試以下:

  string[] inputs = { 
            "drwxr-xr-x 1 0  0     0 Jun 21 13:13 .", 
            "ddrwxr-xr-x 1 0  0     0 Jun 21 13:13 ..", 
            "d-rw-r--r-- 1 0  0    897 Jun 20 15:02 EQA.txt", 
            "d-rw-r--r-- 1 0  0    897 Jun 20 15:06 EQA1.txt", 
            "d-rw-r--r-- 1 0  0    897 Jun 16 20:41 Test.txt", 
            "d-rw-r--r-- 1 0  0    897 Jun 16 21:46 Test1.txt", 
            "d-rw-r--r-- 1 0  0    897 Jun 21 13:13 Test4.txt", 
            "d-rw-r--r-- 1 0  0    913 May 31 18:01 test.123456789.txt", 
            "drwx------ 2 MikePC-apps users  4096 Apr 5 2016 .", 
            "drwx------ 4 MikePC-apps users  4096 Jan 20 2016 ..", 
            "-rw-r--r-- 1 MikePC-apps users   82 Apr 5 2016 test.txt.$01", 
            "-rw-r--r-- 1 MikePC-apps users   82 Aug 10 2016 test.txt.$02", 
            "-rw-r--r-- 1 MikePC-apps users   82 Aug 10 2016 test.txt.asc", 
            "-rw-r--r-- 1 MikePC-apps users   82 Aug 10 2016 test1.txt.$01", 
            "-rw-r--r-- 1 MikePC-apps users  1927 Apr 4 2016 test.zip" 
           }; 

      string pattern = @"^(?'attrib'[^\s]+)\s+(?'links'[^\s]+)\s+(?'owner'[^\s]+)\s+(?'group'[^\s]+)\s+(?'size'[^\s]+)\s+(?'date'.+)\s+(?'filename'[^$]+)$"; 

      foreach (string input in inputs) 
      { 
       Match match = Regex.Match(input, pattern); 
       Console.WriteLine("attrib : '{0}', links : '{1}', owner : '{2}', group : '{3}', size : '{4}', date : '{5}', filename : '{6}'", 
        match.Groups["attrib"].Value, match.Groups["links"].Value, match.Groups["owner"].Value, match.Groups["group"].Value, 
        match.Groups["size"].Value, match.Groups["date"].Value, match.Groups["filename"].Value); 
      } 
      Console.ReadLine(); 
+0

感謝您的溶液, 我修改模式來'字符串模式= @「^( 'ATTRIB'[^ \ S] +?)\ S +( '鏈接'? [^ \ S] +)\ S +(? '所有者'[^ \ S] +)\ S +(? '基團'[^ \ S] +)\ S +(? '尺寸'[^ \ S] +)\ s +(?'date'。+)\ s +(?'filename'。+)$「;' 這也包含'test1.txt。$ 01'作爲文件名。 +1(抱歉無法投票) 謝謝 – Bonobo

+0

$ 01是文件名的一部分 – jdweng

+0

我測試了正則表達式([^ \ s] +)\ s +([^ \ s] +)\ s +([^ \ s (Regexr]上的[] +)\ s +([^ \ s] +)\ s +([^ \ s] +)\ s +(。+)\ s +([^ $] +)因爲[^]是一個否定集合,所以它停在$。 我在模式結尾刪除了$,因爲字符串已經被分割成了句子 – Bonobo