Jump to content

Recommended Posts

Posted

Hi,

Below is an AutoIt script I have written to make it easier to use GREP. (For those who are not familiar with this program: it is a utility to find strings in a bunch of files, real quick. It comes from Unix. It is a great tool for programmers.) GREP needs command line parameters to work, and it's a pain in the neck to type them every time. Output should be redirected to a file which you can then open in Notepad -- more typing or clicking.

The script below does everything automatically, options can be specified in a nice GUI by just a few mouse clicks. Search strings can be entered by the Copy/Paste mechanism of Windows -- no more typing errors. The script needs a GREP version which has been compiled as a console mode Win32 program. I use GREP from the UnixUtils package, it works fine. Search results are displayed using the NOTEPAD replacement WIN32PAD which is a much better editor than NOTEPAD and can properly handle Unix-style text lines (only LF at the end). Both these programs are included in the complete string search package which can be downloaded from my WEB site:

http://invitel.hu/kapla/prog_files.html

The script:

; String Search
;
; AutoIt Version: 3.0
; Language:    English
; Platform:    Win9x/NT
; Author:        Laszlo Menczel (menczel@invitel.hu)
; Date:        4/3/2006
;
; Allows the user to enter an arbitrary search string, then runs GREP to do the search
; and write the result to a text file. The name of file is automatically constructed
; by prefixing the first substring in the search pattern by '0ss_' (a different name
; can also be specified, see below). No extension is added to the filename.
;
; The start directory for search is the current working directory. The result file is
; also written to the current working directory unless explicitly specified otherwise.
;
; The following options can be specified in the dialog box:
;
; - use the search string as a regular exp[b][/b]ression
; - do a recursive search including subdirectories
; - add line numbers to the result
; - number of context lines (lines before and after the matching one) shown
; - specify the name of output file
; - show the results in a text editor window after GREP finished

;-------------------------------- GUI elements ---------------------------------

  #include <GUIConstants.au3>
  
  Opt("ExpandVarStrings", 1)
  Opt("MouseCoordMode", 2)
  Opt("RunErrorsFatal", 0)

 ;---------- main window

  GUICreate("String Search using GREP", 440, 350, -1, -1, -1)
  GUISetState(@SW_SHOW)    

 ;---------- controls for specifying the search pattern
  
  GUICtrlCreateLabel("Search pattern",  20, 20, 80, 20)
  $pattern_inp = GUICtrlCreateInput("", 20, 40, 400, 20)

 ;---------- controls for search option settings

  GUICtrlCreateLabel("Search options",  20, 100, 80, 20)
  $regex_check = GUICtrlCreateCheckbox("regular exp[b][/b]ression",  20, 120, 120, 20)
  $subdir_check = GUICtrlCreateCheckbox("search subdirectories",  160, 120, 120, 20)
  $linenum_check = GUICtrlCreateCheckbox("show line numbers",  300, 120, 120, 20)
  $context_inp = GUICtrlCreateInput ("0", 20, 150, 50, 20)
  $context_adj = GUICtrlCreateUpdown($context_inp)
  GUICtrlCreateLabel("number of context lines",  80, 153, 150, 20)

 ;---------- controls for specifying the oputput file

  GUICtrlCreateLabel("Output file",  20, 200, 100, 20)
  $outfile_inp = GUICtrlCreateInput("", 20, 220, 200, 20)
  GUICtrlCreateGroup ("", 230, 210, 200, 35)
  $auto_rad = GUICtrlCreateRadio ("auto", 245, 220, 55, 20)
  $default_rad = GUICtrlCreateRadio ("default", 300, 220, 60, 20)
  $specify_rad = GUICtrlCreateRadio ("specify", 360, 220, 60, 20)
  GUICtrlCreateGroup ("", -99, -99, 1, 1)

 ;---------- controls for running the program
  
  GUICtrlCreateLabel("Display options",  20, 280, 100, 20)
  $display_check = GUICtrlCreateCheckbox("show result in a window",  20, 300, 150, 20)
  $start_but = GUICtrlCreateButton("Start", 280, 285, 60, 30)
  $cancel_but = GUICtrlCreateButton("Cancel", 360, 285, 60, 30)

 ;---------- control state initialization
  
  GUICtrlSetLimit($context_adj, 20, 0)
  GUICtrlSetState($linenum_check, $GUI_CHECKED)
  GUICtrlSetState($display_check, $GUI_CHECKED)
  GUICtrlSetData($outfile_inp, "0ss_")
  GUICtrlSetState($auto_rad, $GUI_CHECKED)
  GUICtrlSetState($pattern_inp, $GUI_FOCUS)
  GUICtrlSetState($outfile_inp, $GUI_DISABLE)

;-------------------------------- Functions ---------------------------------------  

; UpdateOutFile($rad)
; -------------------
; Sets the status & text of the filename input field appropriate
; for the situation when the radio button '$rad' is checked.

Func UpdateOutFile($rad)

  Dim $pat, $tokens, $out
  
  Select
    Case $rad = $auto_rad
      $pat = GUICtrlRead($pattern_inp)
      $tokens = StringSplit($pat, " ")
      $out = StringFormat("0ss_%s", $tokens[1])
      GUICtrlSetData($outfile_inp, $out)
      GUICtrlSetState($outfile_inp, $GUI_DISABLE)

    Case $rad = $default_rad
      GUICtrlSetData($outfile_inp, "0ss0")
      GUICtrlSetState($outfile_inp, $GUI_DISABLE)

    Case $rad = $specify_rad
      GUICtrlSetState($outfile_inp, $GUI_ENABLE)
      GUICtrlSetState($outfile_inp, $GUI_FOCUS)
  EndSelect

EndFunc

; FocusToPatternInp($x, $y)
; -------------------------
; Sets input focus to the pattern input field, simulates a mouse click
; to make the text inside the field unselected, then returns the mouse
; cursor to the coordinate [$x,$y].

Func FocusToPatternInp($x, $y)

  GUICtrlSetState($pattern_inp, $GUI_FOCUS)
  MouseClick("left", 415, 45, 1, 0)
  MouseMove($x, $y, 0)

EndFunc

; IsFilenameChar($chr)
; --------------------
; Tests if the character '$chr' is present in the string '$filename_char'
; which contains legal filename characters not in the alphanumeric set.
; Returns 1 if yes, zero otherwise.

$filename_char = ".-_!@#$%^&*()[]{}=+<>"

Func IsFilenameChar($chr)

  Dim $i, $next
  
  $i = 1
  While 1
    $next = StringMid($filename_char, $i, 1)

    If $next = "" Then
      Return 0
    Endif
    
    If $next = $chr Then
      Return 1
    Endif

    $i = $i + 1
  Wend

EndFunc

;------------------------------- Main loop ---------------------------------------

$pattern = GUICtrlRead($pattern_inp)
$regex = GUICtrlRead($regex_check)
$run = 0

While 1

  $msg = GUIGetMsg()
    
  Select
    Case $msg = $GUI_EVENT_CLOSE
      ExitLoop

    Case $msg = $cancel_but
      ExitLoop

    Case $msg = $start_but
      If $pattern = "" Then
        MsgBox(0, "Error", "No search pattern")
        FocusToPatternInp(285, 290);
      Else
        $tmp = GUICtrlRead($outfile_inp)
        If $tmp = "" Then
          MsgBox(0, "Error", "No output file")
          FocusToPatternInp(285, 290);
        Else
          $run = 1
          ExitLoop
        Endif
      Endif

    Case $msg = $regex_check
      $tmp = GUICtrlRead($regex_check)
      If $tmp <> $regex Then
        $regex = $tmp
        If $regex = $GUI_CHECKED Then
          GUICtrlSetState($auto_rad, $GUI_UNCHECKED)
          GUICtrlSetState($auto_rad, $GUI_DISABLE)
          GUICtrlSetState($specify_rad, $GUI_UNCHECKED)
          GUICtrlSetState($default_rad, $GUI_CHECKED)
          UpdateOutFile($default_rad)
        Else
          GUICtrlSetState($auto_rad, $GUI_ENABLE)
          GUICtrlSetState($default_rad, $GUI_UNCHECKED)
          GUICtrlSetState($specify_rad, $GUI_UNCHECKED)
          GUICtrlSetState($auto_rad, $GUI_CHECKED)
          UpdateOutFile($auto_rad)
        Endif
        FocusToPatternInp(25, 125)
      Endif
      
    Case $msg = $subdir_check
      FocusToPatternInp(165, 125)

    Case $msg = $linenum_check
      FocusToPatternInp(305, 125)

    Case $msg = $auto_rad
      UpdateOutFile($auto_rad)
      FocusToPatternInp(250, 225)
            
    Case $msg = $default_rad
      UpdateOutFile($default_rad)
      FocusToPatternInp(305, 225)
      
    Case $msg = $specify_rad
      UpdateOutFile($specify_rad)
  EndSelect

  $newpat = GUICtrlRead($pattern_inp)
  If $newpat <> $pattern Then
    $pattern = $newpat
    $tmp = GUICtrlRead($auto_rad)
    If $tmp = $GUI_CHECKED Then
      UpdateOutFile($auto_rad)
    Endif
  Endif

Wend

;------------------------------- Program run -----------------------------------

  If $run = 1 Then

   ;--------- clear option strings

    $r_str = ""
    $c_str = ""
    $s_str = ""
    $l_str = ""
    $o_str = ""
        
   ;--------- check control status & initialize option strings

    If $regex = $GUI_CHECKED Then
      $r_str = "-E "
    Endif

    $context = GUICtrlRead($context_adj)
    If $context > 0 Then
      $c_str = StringFormat("-C %d ", $context)
    Endif

    $subdir = GUICtrlRead($subdir_check)
    If $subdir = $GUI_CHECKED Then
      $s_str = "-r "
    Endif
    
    $linenum = GUICtrlRead($linenum_check)
    If $linenum = $GUI_CHECKED Then
      $l_str = "-n"
    Endif

   ;--------- replace illegal characters in output file name

    $outname = GUICtrlRead($outfile_inp)

    $pos = 1
    While 1
      $tmp = StringMid($outname, $pos, 1)

      If $tmp = "" Then
        ExitLoop
      Endif

      If StringIsAlnum($tmp) OR IsFilenameChar($tmp) Then
        $o_str = $o_str & $tmp
      Else
        $o_str = $o_str & "_"
      Endif

      $pos = $pos + 1
    Wend

   ;---------- construct the command line and run GREP

    $cmd = StringFormat("grep.exe %s%s%s%s %s%s%s * > %s", $r_str, $c_str, $s_str, $l_str, '"', $pattern, '"', $o_str)
    RunWait(@ComSpec & " /c " & $cmd, "", @SW_HIDE)

    If @error = 1 Then
      MsgBox(0, "Error", "GREP did not run")
      Exit
    Endif
    
   ;---------- display result if requested

    $tmp = GUICtrlRead($display_check)

    If $tmp = $GUI_CHECKED Then
      $cmd = StringFormat("win32pad.exe %s", $o_str)
      RunWait(@ComSpec & " /c " & $cmd, "")

      If @error = 1 Then
        MsgBox(0, "Error", "Cannot run the editor")
        Exit
      Endif
    Endif

  Endif 

Exit

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...