Home | 簡體中文 | 繁體中文 | 雜文 | 知乎專欄 | Github | OSChina 博客 | 雲社區 | 雲棲社區 | Facebook | Linkedin | 視頻教程 | 打賞(Donations) | About

1.10. Example

1.10.1. 有趣的Shell

運行後會不停的fork新的進程,直到你的資源消耗盡。

		
:() { :|:& }; :

.() { .|.& }; .
		
		

1.10.2. backup

#!/bin/sh
umount /mnt/backup
mount /dev/sdb1 /mnt/backup

if [ `date +%d` = '01' ] #每月1號進行完全備份
then
	bakdir="/mnt/bak/daybak/month/"`date +%m%d`
	zl="" #進行完全備份
else
	backup_dir="/mnt/backup/"`date +%d`
	zl="-N "`date +'%Y-%m-01 00:00:01'`; #差異備份
	#zl="-N "`date -d '-1 day' +'%Y-%m-%d 00:00:01'` #日增量備份
fi

tar "${zl}" -czf ${backup_dir}/www.tgz /var/www
umount /mnt/backup

		

1.10.3. CPU 核心數

cat /proc/cpuinfo | grep processor | wc -l
		

1.10.4. Password

例 1.12. random password

cat /dev/urandom | head -1 | md5sum | head -c 8

od -N 4 -t x4 /dev/random | head -1 | awk '{print $2}'
			

1.10.5. processes

1.10.5.1. pid

neo@debian:~/html/temp$ pidof lighttpd
2775

neo@debian:~/html/temp$ pgrep lighttpd
2775

neo@debian:~/html/temp$ pid=`pidof lighttpd`
neo@debian:~/html/temp$ echo $pid
2775
		
# user=`whoami`
# pgrep -u $user -f cassandra | xargs kill -9
		

1.10.5.2. kill

kill 占用7800連接埠的進程

kill -9 `netstat -nlp | grep '192.168.0.5:7800' | awk -F ' ' '{print $7}' | awk -F '/' '{print $1}'`
		

1.10.5.3. pgrep

#!/bin/bash
ntpdate 172.16.10.10

pid=$(pgrep rsync)

if [ -z "$pid" ]; then

rsync -auzP --delete -e ssh  --exclude=example/images --exclude=project/product --exclude=project/templates/caches  root@172.16.10.10:/www/project /www

fi
		

1.10.6. Shell 技巧

1.10.6.1. 行轉列,再批評

echo "abc def gfh ijk"| sed "s:\ :\n:g" |grep -w gfh
            

1.10.6.2. for vs while

echo "aaa bbb ccc" > test.txt
echo "ddd eee fff" >> test.txt
            
for line in $(cat test.txt)
do
	echo $line
done
			
cat test.txt| while read line
do
	echo $line
done
			

1.10.6.3. 遍歷字元串

# find . -name "*.html" -o -name "*.php" -o -name '*.dwt' -printf "[%p] " -exec grep -c 'head' {} \; | grep -v "0$" |more
        	

1.10.7. to convert utf-8 from gb2312 code

		
perl   -  MEncode   -  pi   -  e   '  $_=encode_utf8(decode(gb2312=>$_))  '   filename
for f in `find .`; do [ -f $f ] && perl -MEncode -pi -e '$_=encode_utf8(decode(gb2312=>$_))' $f; done;
		
		

1.10.8. 使用內存的百分比

$ free | sed -n 2p | awk '{print "used="$3/$2*100"%","free="$4/$2*100"%"}'
used=53.9682% free=46.0318%		
		

1.10.9. 合併apache被cronlog分割的log檔案

$ find 2009 -type f -name access.log -exec cat {} >> access.log \;
		

1.10.10. Linux 交集 差集 並集

		
測試檔案如下:

[root@test23 ~]# cat a.txt
1.1.1.1
2.2.2.2
3.3.3.3
1.2.3.4
[root@test23 ~]# cat b.txt
4.4.4.4
1.2.3.4
2.2.2.2
a.b.c.d
```
#### grep 
```
1) 差集
// 使用 grep -v 和 -f 參數方式 是最容易想到的

[root@test23 ~]# grep -v -f  a.txt  b.txt
4.4.4.4
a.b.c.d
[root@test23 ~]# grep -v -f   b.txt  a.txt
1.1.1.1
3.3.3.3
```
#### uniq 
```
1) 差集
// -u表示的是輸出出現次數為1的內容
[root@test23 ~]# sort a.txt  b.txt  | uniq -u
1.1.1.1
3.3.3.3
4.4.4.4
a.b.c.d

2) 並集
[root@test23 ~]# sort a.txt  b.txt  | uniq
1.1.1.1
1.2.3.4
2.2.2.2
3.3.3.3
4.4.4.4
a.b.c.d

3) 交集
// -d 表示的是輸出出現次數大於1的內容
[root@test23 ~]# sort a.txt b.txt | uniq -d
1.2.3.4
2.2.2.2