changeset 18:45ca03520eea

ut: add grep.
author pyon@macmini
date Sat, 23 Jun 2018 09:38:15 +0900
parents 72ce457fb99d
children 8008046c8d76
files src/ut/lu/lu.go src/ut/main.go
diffstat 2 files changed, 99 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/src/ut/lu/lu.go	Wed Jun 20 06:01:58 2018 +0900
+++ b/src/ut/lu/lu.go	Sat Jun 23 09:38:15 2018 +0900
@@ -16,6 +16,7 @@
     "os"
     "os/exec"
     "path/filepath"
+    "regexp"
     "strings"
 )
 
@@ -208,11 +209,76 @@
     }
 }
 
+/* grep: done. */
 func Grep( word string, inv bool, files []string ) {
+    regex, err := regexp.Compile( word )
+    if err != nil {
+        log.Fatal( err )
+    }
     if len( files ) == 0 {
-        fmt.Println("grep stdin")
+        grep( regex, inv, os.Stdin )
     } else {
-        fmt.Println("grep")
+        for _, file := range files {
+            f, _ := os.Open( file )
+            grep( regex, inv, f )
+            f.Close()
+        }
+    }
+}
+
+func grep( regex *regexp.Regexp, inv bool, r io.Reader ) {
+    input := bufio.NewScanner( r )
+    for input.Scan() {
+        if regex.MatchString( input.Text() ) && !inv {
+            fmt.Println( input.Text() )
+        }
+        if !regex.MatchString( input.Text() ) && inv {
+            fmt.Println( input.Text() )
+        }
+    }
+}
+
+/* orgrep: done. */
+func OrGrep( lfile string, inv bool, files []string ) {
+    var keywords []regexp.Regexp
+    f, _ := os.Open( lfile )
+    input := bufio.NewScanner( f )
+    for input.Scan() {
+        regex, err := regexp.Compile( input.Text() )
+        if err != nil {
+            log.Fatal( err )
+        }
+        keywords = append( keywords, *regex )
+    }
+    f.Close()
+
+    if len( files ) == 0 {
+        orgrep( keywords, inv, os.Stdin )
+    } else {
+        for _, file := range files {
+            f, _ := os.Open( file )
+            orgrep( keywords, inv, f )
+            f.Close()
+        }
+    }
+}
+
+func orgrep( keywords []regexp.Regexp, inv bool, r io.Reader ) {
+    input := bufio.NewScanner( r )
+    seen := make( map[string]bool )
+    for input.Scan() {
+        for _, r := range keywords {
+            if r.MatchString( input.Text() ) {
+                seen[ input.Text() ] = true
+            }
+        }
+        if !inv && seen[ input.Text() ] {
+            fmt.Println( input.Text() )
+        }
+        if inv && !seen[ input.Text() ] {
+            fmt.Println( input.Text() )
+        }
+        seen[ input.Text() ] = false
     }
 }
 
--- a/src/ut/main.go	Wed Jun 20 06:01:58 2018 +0900
+++ b/src/ut/main.go	Sat Jun 23 09:38:15 2018 +0900
@@ -27,7 +27,7 @@
     "./lu"
 )
 
-var version = "1.02"
+var version = "1.03"
 
 func main() {
 
@@ -47,6 +47,10 @@
     var uniqdc   = flag.Bool( "udc", false, "little uniq tool.( count dup )" )              // ok
     var md5      = flag.Bool( "md5",    false, "md5." )                                     // ok
     var sha256   = flag.Bool( "sha256", false, "sha256." )                                  // ok
+    var grep     = flag.String( "a", "", "little grep tool." )                              // ok
+    var grepv    = flag.String( "b", "", "little grep -v tool." )                           // ok
+    var orgrep   = flag.String( "A", "", "little grep tool. ( from list file )" )           // ok
+    var orgrepv  = flag.String( "B", "", "little grep -v tool. ( from list file )" )        // ok
 
     var msleep   = flag.Bool( "M", false, "sleep." )
     //var swatch   = flag.Bool( "W", false, "stop watch." )
@@ -58,8 +62,6 @@
     var replace  = flag.Bool( "r", false, "replace strings. ( s/arg1/arg2/g )" )
     var sort     = flag.Bool( "s", false, "little sort tool." )
     var nsort    = flag.Bool( "ns", false, "little number sort tool." )
-    var grep     = flag.Bool( "a", false, "little grep tool." )
-    var grepv    = flag.Bool( "b", false, "little grep -v tool." )
     var tree     = flag.Bool( "f", false, "little tree tool." )
     var head     = flag.Int(  "d",     0, "little head/tail tool.( head:n, tail:-n )" )
     //var cut      = flag.String( "c", "", "little cut tool ( only csv )." )
@@ -207,15 +209,35 @@
         os.Exit( 0 )
     }
 
-    if *grep || *grepv {
-        if flag.NArg() < 2 {
-            fmt.Println( "too ?? argnument." )
-            os.Exit( 0 )
+    if *grep != "" {    // done.
+        if err := is_exist_files( flag.Args() ); err != nil {
+            log.Fatal( err )
         }
-        if err := is_exist_files( flag.Args()[1:] ); err != nil {
+        lu.Grep( *grep, false, flag.Args() )
+        os.Exit( 0 )
+    }
+
+    if *grepv != "" {   // done.
+        if err := is_exist_files( flag.Args() ); err != nil {
             log.Fatal( err )
         }
-        lu.Grep( flag.Args()[0], *grepv, flag.Args()[1:] )
+        lu.Grep( *grepv, true, flag.Args() )
+        os.Exit( 0 )
+    }
+
+    if *orgrep != "" {
+        if err := is_exist_files( flag.Args() ); err != nil {
+            log.Fatal( err )
+        }
+        lu.OrGrep( *orgrep, false, flag.Args() )
+        os.Exit( 0 )
+    }
+
+    if *orgrepv != "" {
+        if err := is_exist_files( flag.Args() ); err != nil {
+            log.Fatal( err )
+        }
+        lu.OrGrep( *orgrepv, true, flag.Args() )
         os.Exit( 0 )
     }