# HG changeset patch # User pyon@macmini # Date 1529714295 -32400 # Node ID 45ca03520eeadda7de438c7e0d4b570fbf8669a4 # Parent 72ce457fb99dbe1958eb9e7a9a3d93b589c7546b ut: add grep. diff -r 72ce457fb99d -r 45ca03520eea src/ut/lu/lu.go --- 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 } } diff -r 72ce457fb99d -r 45ca03520eea src/ut/main.go --- 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 ) }