Bash Command Line Examples.

porplague70

Bash Command Line Examples.

After having spent years on unix systems, shell scripting still continues to elude me. Hence these reminders.

contents
  1. For Loops over lists
  2. While loop
  3. The Absolute Current Working Directory
  4. Getting a line count on various directories

For Loops over lists

  • To add a bunch of files to subversion
for f in Button.phi Buttons.phi Cells.phi ; do svn add $f; done
for f in `ls -l *.phi`; do svn add $f; done
  • A more complete sample
ls *.xml
file1.xml  file2.xml  file3.xml

ls *.xml > list

for i in `cat list`; do cp "$i" "$i".bak ; done

ls *.xml*
file1.xml  file1.xml.bak  file2.xml  file2.xml.bak  file3.xml  file3.xml.bak
  • To clear emails to [email protected] out of my mail queue after inspecting the affected files
cd /path/to/mailqueue
ls -l `grep -l '[email protected]' \`find . -type f\``
rm -f `grep -l '[email protected]' \`find . -type f\``

Note: Be sure to run the ls before the rm.

  • A little awking. PIDs of all processes using alsa. Grabs the 2nd column out of a listing.
lsof | grep alsa | awk '{print $2}'
  • This alias produces a sorted list of services and the ports they’re listening on.
alias ports='sudo /usr/bin/lsof -nPi | grep LIST | awk '\''{printf "%-20s%-5s%-5s%s\n",$1,$5,$7,$8}'\'' | sort | uniq'
  • Running ports would then produce something like this:
cupsd               IPv4 TCP  127.0.0.1:631
master              IPv4 TCP  127.0.0.1:25
mysqld              IPv4 TCP  127.0.0.1:3306
portmap             IPv4 TCP  *:111
rpc.mount           IPv4 TCP  *:657
rpc.statd           IPv4 TCP  *:894
smbd                IPv4 TCP  *:139
smbd                IPv4 TCP  *:445
sshd                IPv6 TCP  *:22

While loop

  • Keeping my mail inbox from overflowing while running email stress tests
cd /path/to/maildir/new
while true; do rm -f *; sleep 5; done

The Absolute Current Working Directory

  • AKA Getting the realpath of a location.
  • This is really more useful in scripts, but here goes:
MYCWD=`dirname \`readlink -e $0\``

Getting a line count on various directories

T=0; \
for f in dir1 dir3 dir10; do \
  N=0; \
 for n in `find $f -type f -exec wc -l {} \; | awk '{print $1}'`; do\
    N=$(‎( $M + $n )); \
  done; \
  T=$(‎( $T + $N)); \
  echo $N - $f; \
done; \
echo $T - Total

4686 - dir1
4894 - dir3
981037 - dir10
990617 - Total

Sobre o Autor

plague70 administrator

Deixe uma resposta