views:

2319

answers:

22

There are many things that all programmers should know, but I am particularly interested in the Unix/Linux commands that we should all know. For accomplishing tasks that we may come up against at some point such as refactoring, reporting, network updates etc.

The reason I am curious is because having previously worked as a software tester at a software company while I am studying my degree, I noticed that all of developers (who were developing Windows software) had 2 computers.

To their left was their Windows XP development machine, and to the right was a Linux box. I think it was Ubuntu. Anyway they told me that they used it because it provided powerful unix operations that Windows couldn't do in their development process.

This makes me curious to know, as a software engineer what do you believe are some of the most powerful scripts/commands/uses that you can perform on a Unix/Linux operating system that every programmer should know for solving real world tasks that may not necessarily relate to writing code?

We all know what sed, awk and grep do. I am interested in some actual Unix/Linux scripting pieces that have solved a difficult problem for you, so that other programmers may benefit. Please provide your story and source.

I am sure there are numerous examples like this that people keep in their 'Scripts' folder.

Update: People seem to be misinterpreting the question. I am not asking for the names of individual unix commands, rather UNIX code snippets that have solved a problem for you.

Best answers from the Community


Traverse a directory tree and print out paths to any files that match a regular expression:

find . -exec grep -l -e 'myregex' {} \; >> outfile.txt

Invoke the default editor(Nano/ViM)

(works on most Unix systems including Mac OS X) Default editor is whatever your "EDITOR" environment variable is set to. ie: export EDITOR=/usr/bin/pico which is located at ~/.profile under Mac OS X.

Ctrl+x Ctrl+e

List all running network connections (including which app they belong to)

lsof -i -nP

Clear the Terminal's search history (Another of my favourites)

history -c
+4  A: 

Your shell is the most powerful tool you have available

  1. being able to write simple loops etc
  2. understanding file globbing (e.g. *.java etc.)
  3. being able to put together commands via pipes, subshells. redirection etc.

Having that level of shell knowledge allows you to do enormous amounts on the command line, without having to record info via temporary text files, copy/paste etc., and to leverage off the huge number of utility programs that permit slicing/dicing of data.

Unix Power Tools will show you so much of this. Every time I open my copy I find something new.

Brian Agnew
+7  A: 
  • grep
  • awk
  • sed
  • perl
  • find

A lot of Unix power comes from its ability to manipulate text files and filter data. Of course, you can get all of these commands for Windows. They are just not native in the OS, like they are in Unix.

and the ability to chain commands together with pipes etc. This can create extremely powerful single lines of commands from simple functions.

Xetius
Actually, they tend to be native to the shell, rather than the OS </pendantry>
ZombieSheep
They ARE technically native to Windows if you install the Unix subsystem for Windows (also known as Windows Services for Unix). It's an entire native subsystem like Win32, running side-by-side. Just for the record. On the other hand, if you're saying native and really mean "does not feel alien to a user", you're right ;)
OregonGhost
none of the programs Xetius mentioned are native to the shell, ZombieSheep
Vinko Vrsalovic
@Vinko Vrsalovic - I stand corrected.
ZombieSheep
A: 

Grep (try Windows Grep)

sed (try Sed for Windows)

In fact, there's a great set of ports of really useful *nix commands available at http://gnuwin32.sourceforge.net/. If you have a *nix background and now use windows, you should probably check them out.

ZombieSheep
+1  A: 

When solving problems on faulty linux boxes, by far the most common key sequence I type end up typing is alt+sysrq R E I S U B

Simon P Stevens
A: 

You can do anything with this...

gcc

rikh
I wasn't asking about compiled languages, rather actual UNIX code snippets
Brock Woolf
A: 

You would be better of if you keep a cheatsheet with you... there is no single command that can be termed most useful. If a perticular command does your job its useful and powerful

Edit you want powerful shell scripts? shell scripts are programs. Get the basics right, build on individual commands and youll get what is called a powerful script. The one that serves your need is powerful otherwise its useless. It would have been better had you mentioned a problem and asked how to solve it.

Umair Ahmed
What has been useful for you? Provide an example of it's use and the source.
Brock Woolf
+1  A: 

The power of this tools (grep find, awk, sed) comes from their versatility, so giving a particular case seems quite useless.

man is the most powerful comand, because then you can understand what you type instead of just blindly copy pasting from stack overflow.

Example are welcome, but there are already topics for tis. My most used :

grep something_to_find * -R

which can be replaced by ack and

find | xargs

find with results piped into xargs can be very powerful

shodanex
man is a strange example, because the power comes from reading the documentation, while man is just a tool to show documentation. It's like saying Document Explorer is the most powerful tool when developing with Visual Studio, because it displays the documentation.
OregonGhost
My point is shoving as much one-liners as you can on a web page is not very useful. People should understand what they do
shodanex
+14  A: 

I find commandlinefu.com to be an excellent resource for various shell scripting recipes.

Examples

Common

# Run the last command as root
sudo !!

# Rapidly invoke an editor to write a long, complex, or tricky command
ctrl-x ctrl-e

# Execute a command at a given time
echo "ls -l" | at midnight

Esoteric

# output your microphone to a remote computer's speaker
dd if=/dev/dsp | ssh -c arcfour -C username@host dd of=/dev/dsp
Alex B
The whole site (commandlinefu.com) is an answer to the OP's question.
Grzegorz Oledzki
Cool! I found this site a year before, but forgot to bookmark it. Thanks for bringing it back to me :-) +1
Boldewyn
It's *Ctrl-x Ctrl-e* to invoke the editor, by the way.
Lars Haugseth
First time I've heard of Ctrl-x Ctrl-e , I assume it's a bash thing.Regardless of what EDITOR is set to, it tries to execute emacs, which I don't have - how to change that ?
nos
noselasd: isn't it /usr/bin/editor which is called? (which is symlink to /etc/alternatives/editor in my Ubuntu)
Grzegorz Oledzki
Ctrl-X, Ctrl-E also works on Mac OS X btw
Brock Woolf
A: 

Sort of an aside, but you can get powershell on windows. Its really powerful and can do a lot of the *nix type stuff. One cool difference is that you work with .net objects instead of text which can be useful if you're using the pipeline for filtering etc.

Alternatively, if you don't need the .NET integration, install Cygwin on the Windows box. (And add its directory to the Windows PATH.)

David Archer
+1  A: 

some of you might disagree with me, but nevertheless, here's something to talk about. If one learns gawk ( other variants as well) throughly, one can skip learning and using grep/sed/wc/cut/paste and a few other *nix tools. all you need is one good tool to do the job of many combined.

ghostdog74
How about the flip side? I learned those other tools, so can I skip learning awk?
PTBNL
1) chaining too many tools together adds to overhead. Also most of their functions overlap2) you reduce your learning curve.3) some might say, then why not learn Perl/Python etc, since they can do the same and even more.
ghostdog74
+1  A: 

Some way to search (multiple) badly formatted log files, in which the search string may be found on an "orphaned" next line. For example, to display both the 1st, and a concatenated 3rd and 4th line when searching for id = 110375:

[2008-11-08 07:07:01] [INFO] ...; id = 110375; ...
[2008-11-08 07:07:02] [INFO] ...; id = 238998; ...
[2008-11-08 07:07:03] [ERROR] ... caught exception
...; id = 110375; ...
[2008-11-08 07:07:05] [INFO] ...; id = 800612; ...

I guess there must be better solutions (yes, add them...!) than the following concatenation of the two lines using sed prior to actually running grep:

#!/bin/bash

if [ $# -ne 1 ]
then
  echo "Usage: `basename $0` id"
  echo "Searches all myproject's logs for the given id"
  exit -1
fi  

# When finding "caught exception" then append the next line into the pattern
# space bij using "N", and next replace the newline with a colon and a space
# to ensure a single line starting with a timestamp, to allow for sorting
# the output of multiple files:
ls -rt /var/www/rails/myproject/shared/log/production.* \
  | xargs cat | sed '/caught exception$/N;s/\n/: /g' \
  | grep "id = $1" | sort

...to yield:

[2008-11-08 07:07:01] [INFO] ...; id = 110375; ...
[2008-11-08 07:07:03] [ERROR] ... caught exception: ...; id = 110375; ...

Actually, a more generic solution would append all (possibly multiple) lines that do not start with some [timestamp] to its previous line. Anyone? Not necessarily using sed, of course.

Arjan
+1  A: 
for card in `seq 1 8` ;do  
  for ts in `seq  1 31` ; do 
     echo $card $ts >>/etc/tuni.cfg;
   done
 done

was better than writing the silly 248 lines of config by hand.

Neded to drop some leftover tables that all were prefixed with 'tmp'

for table in `echo show tables | mysql quotiadb |grep ^tmp` ; do
  echo drop table $table
done

Review the output, rerun the loop and pipe it to mysql

nos
if using bash, instead of using external seq command, use {1..8} , {1..31}
ghostdog74
seq is a very powerful construct
ojblass
+3  A: 

My personal favorite is the lsof command.

"lsof" can be used to list opened file descriptors, sockets, and pipes. I find it extremely useful when trying to figure out which processes have used which ports/files on my machine.

Example: List all internet connections without hostname resolution and without port to port name conversion.

lsof -i -nP

http://www.manpagez.com/man/8/lsof/

coderjoe
+1  A: 

If you make a typo in a long command, you can rerun the command with a substitution (in bash):

mkdir ~/aewseomeDirectory

you can see that "awesome" is mispelled, you can type the following to re run the command with the typo corrected

^aew^awe

it then outputs what it substituted (mkdir ~/aweseomeDirectory) and runs the command. (don't forget to undo the damage you did with the incorrect command!)

micmoo
+2  A: 

I use this so much I am actually ashamed of myself. Remove spaces from all filenames and replace them with an underscore:

[removespaces.sh]

#!/bin/bash
find .  -type f -name "* *" | while read file
do
   mv "$file" "${file// /_}"
done
ojblass
I know the inverse (Converting underscore to spaces) is trivial to convert back, perhaps you could add that as a second script to your answer
Brock Woolf
+1  A: 

Finding PIDs without the grep itself showing up

export CUPSPID=`ps -ef | grep cups | grep -v grep | awk '{print $2;}'`
ojblass
ghostdog74
A: 

The fact you can use -name and -iname multiple times in a find command was an eye opener to me.

[findplaysong.sh]

#!/bin/bash
cd ~
echo Matched...
find /home/musicuser/Music/ -type f  -iname "*$1*" -iname "*$2*" -exec echo {} \;
echo Sleeping 5 seconds
sleep 5
find /home/musicuser/Music/ -type f  -iname "*$1*" -iname "*$2*" -exec mplayer {} \;
exit
ojblass
A: 

When things work on one server but are broken on another the following lets you compare all the related libraries:

export MYLIST=`ldd amule | awk ' { print $3; }'`; for a in $MYLIST; do cksum $a; done

Compare this list with the one between the machines and you can isolate differences quickly.

ojblass
+4  A: 

How to exit VI

:wq

Saves the file and ends the misery.

quant_dev
+1 for "ends the misery" :D
Vulcan Eager
or `:q!` to end the great editor without saving!
Jan B. Kjeldsen
Dont forget to push ESC in case you're in edit mode ;)
barfoon
Yes, end the misery! I HATE vi!
Mark Szymanski
+1  A: 

The tr command is the most under-appreciated command in Unix:

#Convert all input to upper case
ls | tr a-z A-Z

#take the output and put into a single line 
ls | tr  "\n" " "

#get rid of all numbers
ls -lt | tr -d 0-9
ojblass
A: 

To run in parallel several processes without overloading too much the machine (in a multiprocessor architecture):

NP=`cat /proc/cpuinfo | grep processor | wc -l`
#your loop here
    if [ `jobs | wc -l` -gt $NP ];
    then
         wait
    fi
    launch_your_task_in_background&
#finish your loop here
fortran
you could lose the cat. grep processor /proc/cpuinfo | wc -l
ghostdog74
yes it's just a bad habit... ^_^ I find it more clear to separate the input in a "cat" instead of using a file argument when I'm working with pipes; so if I have to change arguments to "grep" (or whatever) the filename is not messing around.
fortran
A: 

Best answers from the Community


Traverse a directory tree and print out paths to any files that match a regular expression:

find . -exec grep -l -e 'myregex' {} \; >> outfile.txt

Invoke the default editor(Nano/ViM)

(works on most Unix systems including Mac OS X) Default editor is whatever your "EDITOR" environment variable is set to. ie: export EDITOR=/usr/bin/pico which is located at ~/.profile under Mac OS X.

Ctrl+x Ctrl+e

List all running network connections (including which app they belong to)

lsof -i -nP

Clear the Terminal's search history (Another of my favourites)

history -c
Brock Woolf