The original article are in three parts:
- Part I: Top Ten One-Liners from CommandLineFu Explained
- Part II: The Next Ten One-Liners from CommandLineFu Explained
- Part III: Another Ten One-Liners from CommandLineFu Explained
- Part IV: Yet Another Ten One-Liners from CommandLineFu Explained
In my post, part_1, part_2, part_3, part_4
I love working in the shell. Mastery of shell lets you get things done in seconds, rather than minutes or hours, if you chose to write a program instead.In this article I’d like to explain the top one-liners from the commandlinefu.com. It’s a user-driven website where people get to choose the best and most useful shell one-liners.
But before I do that, I want to take the opportunity and link to a few of my articles that I wrote some time ago on working efficiently in the command line:
- Working Efficiently in Bash (Part I).
- Working Efficiently in Bash (Part II).
- The Definitive Guide to Bash Command Line History.
- A fun article on Set Operations in the Shell.
- Another fun article on Solving Google Treasure Hunt in the Shell.
And now the explanation of top one-liners from commandline.
#1. Run the last command as root
$ sudo !!We all know what the
sudo
command does – it runs the command as another user, in this case, it runs the command as superuser because no other user was specified. But what’s really interesting is the bang-bang!!
part of the command. It’s called the event designator. An event designator references a command in shell’s history. In this case the event designator references the previous command. Writing !!
is the same as writing !-1
. The -1
refers to the last command. You can generalize it, and write !-n
to refer to the n-th previous command. To view all your previous commands, type history
.This one-liner is actually really bash-specific, as event designators are a feature of bash.
I wrote about event designators in much more detail in my article “The Definitive Guide to Bash Command Line History.” The article also comes with a printable cheat sheet for working with the history.
#2. Serve the current directory at http://localhost:8000/
$ python -m SimpleHTTPServerThis one-liner starts a web server on port 8000 with the contents of current directory on all the interfaces (address 0.0.0.0), not just localhost. If you have “
index.html
” or “index.htm
” files, it will serve those, otherwise it will list the contents of the currently working directory.It works because python comes with a standard module called
SimpleHTTPServer
. The -m
argument makes python to search for a module named SimpleHTTPServer.py
in all the possible system locations (listed in sys.path
and $PYTHONPATH
shell variable). Once found, it executes it as a script. If you look at the source code of this module, you’ll find that this module tests if it’s run as a script if __name__ == '__main__'
, and if it is, it runs the test()
method that makes it run a web server in the current directory.To use a different port, specify it as the next argument:
$ python -m SimpleHTTPServer 8080This command runs a HTTP server on all local interfaces on port 8080.
#3. Save a file you edited in vim without the needed permissions
:w !sudo tee %This happens to me way too often. I open a system config file in vim and edit it just to find out that I don’t have permissions to save it. This one-liner saves the day. Instead of writing the while to a temporary file
:w /tmp/foobar
and then moving the temporary file to the right destination mv /tmp/foobar /etc/service.conf
, you now just type the one-liner above in vim and it will save the file.Here is how it works, if you look at the vim documentation (by typing
:he :w
in vim), you’ll find the reference to the command :w !{cmd}
that says that vim runs {cmd}
and passes it the contents of the file as standard input. In this one-liner the {cmd}
part is the sudo tee %
command. It runs tee %
as superuser. But wait, what is %
? Well, it’s a read-only register in vim that contains the filename of the current file! Therefore the command that vim executes becomes tee current_filename
, with the current directory being whatever the current_file
is in. Now what does tee
do? The tee
command takes standard input and write it to a file! Rephrasing, it takes the contents of the file edited in vim, and writes it to the file (while being root)! All done!#4. Change to the previous working directory
$ cd -Everyone knows this, right? The dash “
-
” is short for “previous working directory.” The previous working directory is defined by $OLDPWD
shell variable. After you use the cd
command, it sets the $OLDPWD
environment variable, and then, if you type the short version cd -
, it effectively becomes cd $OLDPWD
and changes to the previous directory.To change to a directory named “
-
“, you have to either cd to the parent directory and then do cd ./-
or do cd /full/path/to/-
.#5. Run the previous shell command but replace string “foo” with “bar”
$ ^foo^bar^This is another event designator. This one is for quick substitution. It replaces
foo
with bar
and repeats the last command. It’s actually a shortcut for !!:s/foo/bar/
. This one-liner applies the s
modifier to the !!
event designator. As we learned from one-liner #1, the !!
event designator stands for the previous command. Now the s
modifier stands for substitute (greetings to sed) and it substitutes the first word with the second word.Note that this one-liner replaces just the first word in the previous command. To replace all words, add the
g
modifer (g
for global):$ !!:gs/foo/barThis one-liner is also bash-specific, as event designators are a feature of bash.
Again, see my article “The Definitive Guide to Bash Command Line History.” I explain all this stuff in great detail.
#6. Quickly backup or copy a file
$ cp filename{,.bak}This one-liner copies the file named
filename
to a file named filename.bak
. Here is how it works. It uses brace expansion to construct a list of arguments for the cp
command. Brace expansion is a mechanism by which arbitrary strings may be generated. In this one-liner filename{,.bak}
gets brace expanded to filename filename.bak
and puts in place of the brace expression. The command becomes cp filename filename.bak
and file gets copied.Talking more about brace expansion, you can do all kinds of combinatorics with it. Here is a fun application:
$ echo {a,b,c}{a,b,c}{a,b,c}It generates all the possible strings 3-letter from the set
{a, b, c}
:aaa aab aac aba abb abc aca acb acc baa bab bac bba bbb bbc bca bcb bcc caa cab cac cba cbb cbc cca ccb cccAnd here is how to generate all the possible 2-letter strings from the set of
{a, b, c}
:$ echo {a,b,c}{a,b,c}It produces:
aa ab ac ba bb bc ca cb ccIf you liked this, you may also like my article where I defined a bunch of set operations (such as intersection, union, symmetry, powerset, etc) by using just shell commands. The article is called “Set Operations in the Unix Shell.” (And since I have sets in the shell, I will soon write articles on on “Combinatorics in the Shell” and “Algebra in the Shell“. Fun topics to explore. Perhaps even “Topology in the Shell” )
#7. mtr – traceroute and ping combined
$ mtr google.comMTR, bettern known as “Matt’s Traceroute” combines both
traceroute
and ping
command. After each successful hop, it sends a ping request to the found machine, this way it produces output of bothtraceroute
and ping
to better understand the quality of link. If it finds out a packet took an alternative route, it displays it, and by default it keeps updating the statistics so you knew what was going on in real time.#8. Find the last command that begins with “whatever,” but avoid running it
$ !whatever:pAnother use of event designators. The
!whatever
designator searches the shell history for the most recently executed command that starts with whatever
. But instead of executing it, it prints it. The :p
modifier makes it print instead of executing.This one-liner is bash-specific, as event designators are a feature of bash.
Once again, see my article “The Definitive Guide to Bash Command Line History.” I explain all this stuff in great detail.
#9. Copy your public-key to remote-machine for public-key authentication
$ ssh-copy-id remote-machineThis one-liner copies your public-key, that you generated with
ssh-keygen
(either SSHv1 file identity.pub or SSHv2 file id_rsa.pub) to the remote-machine
and places it in ~/.ssh/authorized_keys
file. This ensures that the next time you try to log into that machine, public-key authentication (commonly referred to as “passwordless authentication.”) will be used instead of the regular password authentication.If you wished to do it yourself, you’d have to take the following steps:
your-machine$ scp ~/.ssh/identity.pub remote-machine: your-machine$ ssh remote-machine remote-machine$ cat identity.pub >> ~/.ssh/authorized_keysThis one-liner saves a great deal of typing. Actually I just found out that there was a shorter way to do it:
your-machine$ ssh remote-machine 'cat >> .ssh/authorized_keys' < .ssh/identity.pub
#10. Capture video of a linux desktop
$ ffmpeg -f x11grab -s wxga -r 25 -i :0.0 -sameq /tmp/out.mpgA pure coincidence, I have done so much video processing with ffmpeg that I know what most of this command does without looking much in the manual.
The ffmpeg generally can be descibed as a command that takes a bunch of options and the last option is the output file. In this case the options are
-f x11grab -s wxga -r 25 -i :0.0 -sameq
and the output file is /tmp/out.mpg
.Here is what the options mean:
-f x11grab
makes ffmpeg to set the input video format as x11grab. The X11 framebuffer has a specific format it presents data in and it makes ffmpeg to decode it correctly.-s wxga
makes ffmpeg to set the size of the video to wxga which is shortcut for 1366×768. This is a strange resolution to use, I’d just write-s 800x600
.-r 25
sets the framerate of the video to 25fps.-i :0.0
sets the video input file to X11 display 0.0 at localhost.-sameq
preserves the quality of input stream. It’s best to preserve the quality and post-process it later.
-i :0.0
to -i host:0.0
.If you’re interested in ffmpeg, here are my other articles on ffmpeg that I wrote while ago:
- How to Extract Audio Tracks from YouTube Videos
- Converting YouTube Flash Videos to a Better Format with ffmpeg
Have fun. See ya!
Here are the next ten top one-liners from the commandlinefu website. The first post about the topic became massively popular and received over 100,000 views in the first two days.
Before I dive into the next ten one-liners, I want to take the chance and promote the other three article series on one-liners that I have written:
- Awk One-Liners Explained (4 part article).
- Sed One-Liners Explained (3 part article).
- Perl One-Liners Explained (9 part article, work in progress).
Alright, so here are today’s one-liners:
#11. Edit the command you typed in your favorite editor
$ command <CTRL-x CTRL-e>This one-liner opens the so-far typed
command
in your favorite text editor for further editing. This is handy if you are typing a lengthier shell command. After you have done editing the command, quit from your editor successfully to execute it. To cancel execution, just erase it. If you quit unsuccessfully, the command you had typed before diving into the editor will be executed.Actually, I have to educate you, it’s not a feature of the shell per se but a feature of the readline library that most shells use for command line processing. This particular binding
CTRL-x CTRL-e
only works inreadline emacs editing mode. The other mode is readline vi editing mode, in which the same can be accomplished by pressing ESC
and then v
.The emacs editing mode is the default in all the shells that use the readline library. The usual command to change between the modes is
set -o vi
to change to vi editing mode and set -o emacs
to change back to emacs editing mode.To change the editor, export the
$EDITOR
shell variable to your preference. For example, to set the default editor to pico, type export EDITOR=pico
.Another way to edit commands in a text editor is to use
fc
shell builtin (at least bash has this builtin). Thefc
command opens the previous edited command in your favorite text editor. It’s easy to remember thefc
command because it stands for “fix command.”Remember the
^foo^bar^
command from the first top ten one-liners? You can emulate this behavior by typing fc -s foo=bar
. It will replace foo
with bar
in the previous command and execute it.#12. Empty a file or create a new file
$ > file.txtThis one-liner either wipes the file called
file.txt
empty or creates a new file called file.txt
.The shell first checks if the file
file.txt
exists. If it does, the shell opens it and wipes it clean. If it doesn’t exist, the shell creates the file and opens it. Next the shell proceeds to redirecting standard output to the opened file descriptor. Since there is nothing on the standard output, the command succeeds, closes the file descriptor, leaving the file empty.Creating a new empty file is also called touching and can be done by
$ touch file.txt
command. Thetouch
command can also be used for changing timestamps of the commands. Touch, however, won’t wipe the file clean, it will only change the access and modification timestamps to the current time.#13. Create a tunnel from localhost:2001 to somemachine:80
$ ssh -N -L2001:localhost:80 somemachineThis one-liner creates a tunnel from your computer’s port 2001 to somemachine’s port 80. Each time you connect to port 2001 on your machine, your connection gets tunneled to somemachine:80.
The
-L
option can be summarized as -L port:host:hostport
. Whenever a connection is made tolocalhost:port
, the connection is forwarded over the secure channel, and a connection is made tohost:hostport
from the remote machine.The
-N
option makes sure you don’t run shell as you connect to somemachine.To make things more concrete, here is another example:
$ ssh -f -N -L2001:www.google.com:80 somemachineThis one-liner creates a tunnel from your computer’s port 2001 to www.google.com:80 via somemachine. Each time you connect to localhost:2001, ssh tunnels your request via somemachine, where it tries to open a connection to www.google.com.
Notice the additional
-f
flag – it makes ssh daemonize (go into background) so it didn’t consume a terminal.#14. Reset terminal
$ resetThis command resets the terminal. You know, when you have accidentally output binary data to the console, it becomes messed up. The
reset
command usually cleans it up. It does that by sending a bunch of special byte sequences to the terminal. The terminal interprets them as special commands and executes them.Here is what BusyBox’s
reset
command does:printf("\033c\033(K\033[J\033[0m\033[?25h");It sends a bunch of escape codes and a bunch of CSI commands. Here is what they mean:
\033c
: "ESC c" - sends reset to the terminal.\033(K
: "ESC ( K" - reloads the screen output mapping table.\033[J
: "ESC [ J" - erases display.\033[0m
: "ESC [ 0 m" - resets all display attributes to their defaults.\033[?25h
: "ESC [ ? 25 h" - makes cursor visible.
#15. Tweet from the shell
$ curl -u user:pass -d status='Tweeting from the shell' http://twitter.com/statuses/update.xmlThis one-liner tweets your message from the terminal. It uses the curl program to HTTP POST your tweet via Twitter's API.
The
-u user:pass
argument sets the login and password to use for authentication. If you don't wish your password to be saved in the shell history, omit the :pass
part and curl will prompt you for the password as it tries to authenticate. Oh, and while we are at shell history, another way to omit password from being saved in the history is to start the command with a space! For example, <space>curl ...
won't save the curl command to the shell history.The
-d status='...'
instructs curl to use the HTTP POST method for the request and sendstatus=...
as POST data.Finally,
http://twitter.com/statuses/update.xml
is the API URL to POST the data to.Talking about Twitter, I'd love if you followed me on Twitter!
#16. Execute a command at midnight
$ echo cmd | at midnightThis one-liner sends the shell command
cmd
to the at-daemon (atd) for execution at midnight.The
at
command is light on the execution-time argument, you may write things like 4pm tomorrow
to execute it at 4pm tomorrow, 9pm next year
to run it on the same date at 9pm the next year, 6pm + 10 days
to run it at 6pm after 10 days, or now +1minute
to run it after a minute.Use
atq
command to list all the jobs that are scheduled for execution and atrm
to remove a job from the queue.Compared to the universally known
cron
, at
is suitable for one-time jobs. For example, you'd use cron
to execute a job every day at midnight but you would use at
to execute a job only today at midnight.Also be aware that if the load is greater than some number (for one processor systems the default is 0.8), then
atd
will not execute the command! That can be fixed by specifying a greater max load to atd
via-l
argument.#17. Output your microphone to other computer's speaker
$ dd if=/dev/dsp | ssh username@host dd of=/dev/dspThe default sound device on Linux is
/dev/dsp
. It can be both written to and read from. If it's read from then the audio subsystem will read the data from the microphone. If it's written to, it will send audio to your speaker.This one-liner reads audio from your microphone via the
dd if=/dev/dsp
command (if
stands for input file) and pipes it as standard input to ssh
. Ssh
, in turn, opens a connection to a computer at host
and runs the dd of=/dev/dsp
(of
stands for output file) on it. Dd of=/dev/dsp
receives the standard input that ssh
received from dd if=/dev/dsp
. The result is that your microphone gets output on host
computer's speaker.Want to scare your colleague? Dump
/dev/urandom
to his speaker by dd if=/dev/urandom
.#18. Create and mount a temporary RAM partition
# mount -t tmpfs -o size=1024m tmpfs /mntThis command creates a temporary RAM filesystem of 1GB (1024m) and mounts it at
/mnt
. The -t
flag to mount specifies the filesystem type and the -o size=1024m
passes the size
sets the filesystem size.If it doesn't work, make sure your kernel was compiled to support the tmpfs. If tmpfs was compiled as a module, make sure to load it via
modprobe tmpfs
. If it still doesn't work, you'll have to recompile your kernel.To unmount the ram disk, use the
umount /mnt
command (as root). But remember that mounting at/mnt
is not the best practice. Better mount your drive to /mnt/tmpfs
or a similar path.If you wish your filesystem to grow dynamically, use
ramfs
filesystem type instead of tmpfs
. Another note: tmpfs may use swap, while ramfs won't.#19. Compare a remote file with a local file
$ ssh user@host cat /path/to/remotefile | diff /path/to/localfile -This one-liner diffs the file
/path/to/localfile
on local machine with a file/path/to/remotefile
on host
machine.It first opens a connection via
ssh
to host
and executes the cat /path/to/remotefile
command there. The shell then takes the output and pipes it to diff /path/to/localfile -
command. The second argument -
to diff
tells it to diff the file /path/to/localfile
against standard input. That's it.#20. Find out which programs listen on which TCP ports
# netstat -tlnpThis is an easy one. Netstat is the standard utility for listing information about Linux networking subsystem. In this particular one-liner it's called with
-tlnp
arguments:-t
causes netstat to only list information about TCP sockets.-l
causes netstat to only list information about listening sockets.-n
causes netstat not to do reverse lookups on the IPs.-p
causes netstat to print the PID and name of the program to which the socket belongs (requires root).
lsof
utility. See my article "A Unix Utility You Should Know About: lsof" for more information.That's it for today.
Tune in the next time for "Another Ten One-Liners from CommandLineFu Explained". There are many more nifty commands to write about. But for now, have fun and see ya!#21. Display currently mounted file systems nicely
$ mount | column -tThe file systems are not that important here. The
column -t
command is what is important. It takes the input and formats it into multiple columns so that all columns were aligned vertically.Here is how the mounted filesystem list looks without
column -t
command:$ mount /dev/root on / type ext3 (rw) /proc on /proc type proc (rw) /dev/mapper/lvmraid-home on /home type ext3 (rw,noatime)And now with
column -t
command:$ mount | column -t /dev/root on / type ext3 (rw) /proc on /proc type proc (rw) /dev/mapper/lvmraid-home on /home type ext3 (rw,noatime)You can improve this one-liner now by also adding column titles:
$ (echo "DEVICE - PATH - TYPE FLAGS" && mount) | column -t DEVICE - PATH - TYPE FLAGS /dev/root on / type ext3 (rw) /proc on /proc type proc (rw) /dev/mapper/lvmraid-home on /home type ext3 (rw,noatime)Columns 2 and 4 are not really necessary. We can use
awk
text processing utility to get rid of them:$ (echo "DEVICE PATH TYPE FLAGS" && mount | awk '$2=$4="";1') | column -t DEVICE PATH TYPE FLAGS /dev/root / ext3 (rw) /proc /proc proc (rw) /dev/mapper/lvmraid-home /home ext3 (rw,noatime)Finally, we can make it an alias so that we always enjoyed the nice output from mount. Let's call this alias
nicemount
:$ nicemount() { (echo "DEVICE PATH TYPE FLAGS" && mount | awk '$2=$4="";1') | column -t; }Let's try it out:
$ nicemount DEVICE PATH TYPE FLAGS /dev/root / ext3 (rw) /proc /proc proc (rw) /dev/mapper/lvmraid-home /home ext3 (rw,noatime)It works!
#22. Run the previous shell command but replace every "foo" with "bar"
$ !!:gs/foo/barI explained this type of one-liners in one-liner #5 already. Please take a look for a longer discussion.
To summarize, what happens here is that the
!!
recalls the previous executed shell command and:gs/foo/bar
substitutes (the :s
flag) all (the g
flag) occurrences of foo
with bar
. The !!
construct is called an event designator.#23. Top for files
$ watch -d -n 1 'df; ls -FlAt /path'This one-liner watches for file changes in directory
/path
. It uses the watch
command that executes the given command periodically. The -d
flag tells watch
to display differences between the command calls (so you saw what files get added or removed in /path
). The -n 1
flag tells it to execute the command every second.The command to execute is
df; ls -FlAt /path
that is actually two commands, executed one after other. First, df
outputs the filesystem disk space usage, and then ls -FlAt
lists the files in /path
. The -F
argument to ls
tells it to classify files, appending */=>@|
to the filenames to indicate whether they are executables *
, directories /
, sockets =
, doors >
, symlinks @
, or named pipes |
. The -l
argument lists all files, -A
hides .
and ..
, and -t
sorts the files by time.Special note about doors - they are Solaris thing that act like pipes, except they launch the program that is supposed to be the receiving party. A plain pipe would block until the other party opens it, but a door launches the other party itself.
Actually the output is nicer if you specify
-h
argument to df
so it was human readable. You can also join the arguments to watch
together, making them -dn1
. Here is the final version:$ watch -dn1 'df -h; ls -FlAt /path'Another note -
-d
in BSD is --differences
#24. Mount a remote folder through SSH
$ sshfs name@server:/path/to/folder /path/to/mount/pointThat's right, you can mount a remote directory locally via SSH! You'll first need to install two programs however:
- FUSE that allows to implement filesystems in userspace programs, and
- sshfs client that uses FUSE and
sftp
(secure ftp - comes with OpenSSH, and is on your system already) to access the remote host.
sshfs
to mount remote directories via SSH.To unmount, use
fusermount
:fusermount -u /path/to/mount/point
#25. Read Wikipedia via DNS
$ dig +short txt <keyword>.wp.dg.cxThis is probably the most interesting one-liner today. David Leadbeater created a DNS server, which when queried the TXT record type, returns a short plain-text version of a Wikipedia article. Here is his presentationon he did it.
Here is an example, let's find out what "hacker" means:
$ dig +short txt hacker.wp.dg.cx "Hacker may refer to: Hacker (computer security), someone involved in computer security/insecurity, Hacker (programmer subculture), a programmer subculture originating in the US academia in the 1960s, which is nowadays mainly notable for the free software/" "open source movement, Hacker (hobbyist), an enthusiastic home computer hobbyist http://a.vu/w:Hacker"The one-liner uses
dig
, the standard sysadmin's utility for DNS troubleshooting to do the DNS query. The+short
option makes it output only the returned text response, and txt
makes it query the TXT record type.This one-liner is actually alias worthy, so let's make an alias:
wiki() { dig +short txt $1.wp.dg.cx; }Try it out:
$ wiki hacker "Hacker may refer to: Hacker (computer security), ..."It works!
If you don't have
dig
, you may also use host
that also performs DNS lookups:host -t txt hacker.wp.dg.cx
#26. Download a website recursively with wget
$ wget --random-wait -r -p -e robots=off -U Mozilla www.example.comThis one-liner does what it says. Here is the explanation of the arguments:
--random-wait
- wait between 0.5 to 1.5 seconds between requests.-r
- turn on recursive retrieving.-e robots=off
- ignore robots.txt.-U Mozilla
- set the "User-Agent" header to "Mozilla". Though a better choice is a real User-Agent like "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729)".
--limit-rate=20k
- limits download speed to 20kbps.-o logfile.txt
- log the downloads.-l 0
- remove recursion depth (which is 5 by default).--wait=1h
- be sneaky, download one file every hour.
#27. Copy the arguments of the most recent command
ALT + . (or ESC + .)This keyboard shortcut works in shell's emacs editing mode only, it copies the last argument form the last command to the current command. Here is an example:
$ echo a b c a b c $ echo <Press ALT + .> $ echo cIf you repeat the command, it copies the last argument from the command before the last, then if you repeat again, it copies the last argument from command before the command before the last, etc.
Here is an example:
$ echo 1 2 3 1 2 3 $ echo a b c a b c $ echo <Press ALT + .> $ echo c $ echo <Press ALT + .> again $ echo 3However, if you wish to get 1st or 2nd or n-th argument, use the digit-argument command
ALT + 1 (or ESC + 1)
or ALT + 2 (or ESC +2)
, etc. Here is an example:$ echo a b c a b c $ echo <Press ALT + 1> <Press ALT + .> $ echo a a $ echo <Press ALT + 2> <Press ALT + .> $ echo b bSee my article on Emacs Editing Mode Keyboard Shortcuts for a tutorial and a cheat sheet of all the shortcuts.
#28. Execute a command without saving it in the history
$ <space>commandThis one-liner works at least on bash, I haven't tested other shells.
If you start your command by a space, it won't be saved to bash history (~/.bash_history file). This behavior is controlled by
$HISTIGNORE
shell variable. Mine is set to HISTIGNORE="&:[ ]*"
, which means don't save repeated commands to history, and don't save commands that start with a space to history. The values in $HISTIGNORE
are colon-separated.If you're interested, see my article "The Definitive Guide to Bash Command Line History" for a short tutorial on how to work with shell history and a summary cheat sheet.
#29. Show the size of all sub folders in the current directory
$ du -h --max-depth=1The
--max-depth=1
causes du
to summarize disk usage statistics for directories that are depth 1 from the current directory, that is, all directories in the current directory. The -h
argument makes the summary human-readable, that is, displays 5MB instead of 5242880 (bytes).If you are interested in both sub folder size and file size in the current directory, you can use the shorter:
$ du -sh *
#30. Display the top ten running processes sorted by memory usage
$ ps aux | sort -nk +4 | tailThis is certainly not the best way to display the top ten processes that consume the most memory, but, hey, it works.
It takes the output of
ps aux
, sort
s it by 4th column numerically and then uses tail
to output the last then lines which happen to be the processes with the biggest memory consumption.If I was to find out who consumes the most memory, I'd simply use
htop
or top
and not ps
.Bonus one-liner: Start an SMTP server
python -m smtpd -n -c DebuggingServer localhost:1025This one-liner starts an SMTP server on port 1025. It uses Python's standard library
smtpd
(specified by-m smtpd
) and passes it three arguments - -n
, -c DebuggingServer
and localhost:1025
.The
-n
argument tells Python not to setuid (change user) to "nobody" - it makes the code run under your user.The
-c DebuggingServer
argument tells Python to use DebuggingServer
class as the SMTP implementation that prints each message it receives to stdout.The
localhost:1025
argument tells Python to start the SMTP server on locahost, port 1025.However, if you wish to start it on the standard port 25, you'll have to use
sudo
command, because only root is allowed to start services on ports 1-1024. These are also known as privileged ports.sudo python -m smtpd -n -c DebuggingServer localhost:25This one-liner was coined by Evan Culver. Thanks to him!
And here are today's one-liners:
31. Quickly access ASCII table.
$ man 7 asciiEver forgot a keycode for some ASCII character or escape code? Look no further,
man ascii
contains the 7-bit ASCII table. Take a look at it online.Linux man pages are full of gems like these. One day I actually went through all the man pages to find the most interesting ones. An article about them is upcoming but before I get it published, here are a few interesting ones:
- man 1 intro - a tutorial that gets you started with Linux if you have never used it.
- man 2 syscalls - lists all Linux system calls by kernel version.
- man 2 select_tut -
select()
system call tutorial. - man 3 string - lists all <string.h> string manipulation functions.
- man 3 stdio - lists and describes all <stdio.h> standard input/output library functions.
- man 3 errno - lists and describes all
errno
error numbers. - man 4 console_codes - Linux console escape and control sequences.
- man 4 full -
/dev/full
- a device that simulates a full device. - man 5 proc - lots of info about the
/proc
filesystem. - man 5 filesystems - lists various Linux filesystems.
- man 7 bootparam - a tutorial and reference of Linux kernel boot parameters.
- man 7 charsets - a Linux programmer's view of character sets and internationalization.
- man 7 glob - how pathname globbing works.
- man 7 hier - description of the Linux file system hierarchy.
- man 7 operator - C language operator precedence and associativity table.
- man 7 regex - basic and extended regular expression overview.
- man 7 suffixes - lists common Linux file suffixes and the associated file types.
- man 7 time - overview of time and timers.
- man 7 units - kilo, kibi, mega, mebi, giga, gibi, ... - decimal (SI) and binary system of units.
- man 7 utf8 - description of UTF-8 encoding.
- man 7 url - description of URIs, URLs and URNs.
32. Simple timer.
$ time readThis one-liner can be used a simple timer. For example, if you wish to time something, you can execute it when the event starts and press the return key when the event ends. It will output the time the event took to finish.
Here is how this one-liner works. First the
time
command times any command that is supplied to it. In this case the command supplied to it is read
that reads a line from the standard input. As soon as you press enter, read
finishes and time reports how long it took.If you get annoyed by having to press enter, you can specify that
read
should return after having read 1 character,$ time read -N 1Now you can press any key to stop the timer.
If you wish to run a timer for a specific number of seconds, you can add
-t
flag for timeout,$ time read -t 60This would stop the timer after 60 seconds.
33. Shutdown a Windows machine.
$ net rpc shutdown -I IP_ADDRESS -U username%passwordEveryone knows the
net
command, right? We all used to net use \\ip\ipc$ *
, right? Anyway, the
net
command comes as part of Samba, which allows you, for example, to use Linux in a Windows workgroup.This particular one-liner executes the
shutdown
command on a Windows computer located atIP_ADDRESS
with as the user username
with password password
.To reboot a machine use the
-r
switch to net rpc
:$ net rpc shutdown -r -I IP_ADDRESS -U username%passwordIf you're on an unsecured network, don't forget about the good old
nmblookup
and smbclient
tools that come with Samba.34. Execute a command independently from the current shell.
$ (cd /tmp && ls)This one-liner illustrates subshells. Here the commands
cd /tmp
and ls
are executed but they do not affect the current shell. If you had done just cd /tmp && ls
, your current shell would have changed directory to /tmp
but in this one-liner it happens in a subshell and your current shell is not affected.Surely, this is only a toy example. If you wanted to know what's in
/tmp
, you'd do just ls /tmp
.Actually, talking about
cd
, be aware of pushd
and popd
commands. They allow you to maintain a stack of directories you want to return to later. For example,/long/path/is/long$ pushd . /long/path/is/long$ cd /usr /usr$ popd /long/path/is/long$Or even shorter, passing the directory you're gonna
cd
to directly to pushd
,/long/path/is/long$ pushd /usr /usr$ popd /long/path/is/long$Another cool trick is to use
cd -
to return to the previous directory. Here is an example,/home/pkrumins$ cd /tmp /tmp$ cd - /home/pkrumins$
35. Tunnel your SSH connection via intermediate host.
$ ssh -t reachable_host ssh unreachable_hostThis one-liner creates an ssh connection to
unreachable_host
via reachable_host
. It does it by executing the ssh unreachable_host
on reachable_host
. The -t
forces ssh to allocate a pseudo-tty, which is necessary for working interactively in the second ssh to unreachable_host
.This one-liner can be generalized. You can tunnel through arbitrary number of ssh servers:
$ ssh -t host1 ssh -t host2 ssh -t host3 ssh -t host4 ...Now catch me if you can.
36. Clear the terminal screen.
$ CTRL+lPressing CTRL+l (that's small
L
) clears the screen leaving the current line at the top of the screen.If you wish to clear just some line, you can use argumented version of
CTRL+l
- first press ESC
, then the line you want to clear, let's say 21 (21st line), and then press the same CTRL+l. That will clear the 21st line on the screen without erasing the whole screen.$ ESC 21 CTRL+lThis command outputs a special "clear-screen" sequence to the terminal. The same can be achieved by
tput
command,$ tput clearAnother way to clear the terminal (usually when the screen gets garbled) is to use the
reset
command,$ reset
37. Hear when the machine comes back online.
$ ping -a IPEver had a situation when you need to know when the system comes up after a reboot? Up until now you probably launched
ping
and either followed the timeouts until the system came back, or left it running and occasionally checked its output to see if the host is up. But that is unnecessary, you can make ping -a
audible! As soon as the host at IP
is back, ping
will beep!38. List 10 most often used commands.
$ history | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn | headThe person who wrote it has the Unix mindset right. He's combining several shell commands to get the result he/she wants.
First,
history
outputs all the commands the person has executed. Next, awk
counts how many times the second column $2
appears in the output. Once history
has output all the commands and awk
has counted them, awk
loops over all the commands and outputs the count a[i]
separated by space, followed by the command itself. Then sort
takes this input and sorts numerically -n
and reverses the output -r
, so that most frequent commands were on top. Finally head
outputs the first 10 most frequent history commands.If you want to see more than 10 commands (or less), change
head
to head -20
for 20 commands orhead -5
for 5 commands.39. Check gmail for new mail.
$ curl -u you@gmail.com --silent "https://mail.google.com/mail/feed/atom" | perl -ne \ ' print "Subject: $1 " if /<title>(.+?)<\/title>/ && $title++; print "(from $1)\n" if /<email>(.+?)<\/email>/; 'Gmail is cool because they offer an Atom feed for the new mail. This one-liner instructs
curl
to retrieve the feed and authenticate as you@gmail.com
. You'll be prompted a password after you execute the command. Next it feeds the output to perl
. Perl extracts the title (subject) of each email and the sender's email. These two items are printed to stdout.Here is a the output when I run the command,
Subject: i heard you liked windows! (from gates@microsoft.com) Subject: got root? (from bofh@underground.org)
40. Watch Star-Wars via telnet.
$ telnet towel.blinkenlights.nlNeeds no explaining. Just telnet to the host to watch ASCII Star-Wars.
And here is another one,
$ telnet towel.blinkenlights.nl 666Connecting on port 666 will spit out BOFH excuses.
No comments:
Post a Comment