Use bash like a hacker

Use bash like a hacker

By devin, 23 December, 2015

Through long trial and error, and with a healthy dose of help from the Linux from Scratch website, I've accumulated some good knowledge of Bash in my time with Linux and OS/X. Here are the highlights:

When I first got a Mac, I was frustrated by needing to interact with the point and click GUI all the time. My thesis advisor, Dan Lizotte, told me "But no, you need to think like a Mac user!". That's when he told me about two tricks. The first is pretty cool: open a terminal, type "cd ", and then drag and drop a folder from the Finder into your Terminal window. The path gets pasted in, and when you hit Enter you'll be sent to that folder!

The reverse is even more powerful:

open . # open the current directory in Finder

open song.mp3 # open the file with the normal program

# OSX would associate with that file

open -a VLC.app song.mp3 # open the file with a specific app!

Another great command that comes in useful all the time is sed. Here are some useful commands

echo "this is a test" | sed -e 's/test/sed test/' # outputs "this is a sed test"

sed -i'' -e 's/test/sed test/' file.txt #replace words in a file in place

sed -i '' -e 's/test/sed test/' file.txt #OS/X version

You'll need to use man regex to harness the full power of sed's replacements.

Grep is great, and really useful

grep "search string" file

cat file | grep "search string"

grep -v "inverted search" file

grep -r "line of code" somefolder # search a directory recursively

grep -r "line of code" *

grep -rl "line of code" * # only output the filenames

grep -v '^#' file # -v inverts the match - this shows all lines NOT starting with #

grep -C 3 string file # show the line plus the three lines before and after it

grep -A 2 -B 4 string file # show the line plus 2 lines after and 4 lines before

grep -m 3 string file # show a maximum of 3 matches

Often I have great success combining grep and sed to do incredible things when processing output. Another command that comes in handy when modifying files and streams is awk. The only command I ever really use with awk is this:

echo "one two three four five" | awk '{print $1 $5}' # outputs "one five"

echo "one,two,three,four,five" | awk -f, '{print $1 $5}' # outputs "one five" by splitting on comma instead of space

Head and tail are also very useful:

head file # show ten lines

tail file # show last ten lines

tail -n+10 # show all but the last ten lines

head -n3 file # show first three lines

tail -n3 file # show last three lines

But I find my most productivity comes from the Bash-specific tricks. Bash is interesting; to get information on its built-in commands, you need to use "help command" instead of "man command", so a lot of them are kind of esoteric.

My favourite by far is history.

history # output a numbered list of all your recent commands

!1000 # execute command 1000 from the history with the same arguments

!1000:p # show command 1000, and let you hit the Up arrow key to modify and/or run the command

rspec cool_spec.rb

vim !$ # !$ is replaced by the last argument of the previous command

rspec !$ # so these two commands edit and then re-run rspec on cool_spec.rb

!! # re-run the previous command

sudo !! # re-run the previous command via sudo

grep -rl string * # get list of files containing the string

vim $(!!) # edit the list of files you just found with grep

# $() runs a command and returns the output as arguments

!rs # finds the most recent command in history starting with "rs" and runs it

You can also use "reverse-i-search" to search through your history a bit more efficiently than with !?. Just type Ctrl+R and then start typing the command you want. This is useful for instance if you want to re-run a command prefixed with sudo, because it's harder to match. ! only matches on the first word.

 

 

 

 

 

 

 

 

 

 

 

 

Tags

Plain text

  • No HTML tags allowed.
  • Web page addresses and email addresses turn into links automatically.
  • Lines and paragraphs break automatically.