@set的严谨使用@
set -eux
-e 如果命令带非零值返回,立即退出
-u 当执行参数括展时,把非设置变量作为错误处理(如果扩展企图 出现在非设置变量中,shell显示错误信息.如果不是交互式,则带非零值退出)
-x 在每个简单命令被扩展之后,显示PS4扩展值,之后是要执行的命令
@set -e可能引起的错误@
并不是所有命令的返回值,非0就是表示失败的
diff:0表示两个文件相同;1表示两个文件不同;2表示异常,例如两个对比项目里面有一个是目录不是文件
grep:0表示有匹配返回;1表示无匹配返回;2表示异常,例如grep目标是文件夹,却没有添加遍历等等
容易引发的问题
set -e 不是万能的,如果不绕开diff、grep等等这类返回值2为异常的情况,流程会在一些莫名其妙的情况下被终止
过于定式的习惯会引起不必要的麻烦
if [ $? -eq 0 ]; then
set -e 中如何解决
将这个特殊命令,用 set +e 和 set -e 包起来,即暂时关闭e选项
将这个特殊命令,用( )包起来
set -e 只对当前线程有效,对子线程失效
( ) 会将里面的流程建立一个子线程,一般系统默认是不开启e选项的
@unset的用法@
uninitialized_variable=23 # 赋值
unset uninitialized_variable #Unset it.
echo "uninitialized_variable= $uninitialized_variable"
@MKDIR- p @
可以是一个路径名称。此时若路径中的某些目录尚不存在, 加上此选项后, 系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录。比如:假设当前目录中存在test,则mkdir test/test2/test3报错,因为test2不存在,无法创建test3。而mkdir -p test/test2/test3就可以。
@带文件夹外壳复制所有文件VS不带文件夹外壳复制所有文件
若cp ./abc/*.* test_duplicate/ 则,test duplicate下面将有所有的文件。
若cp ./abc/ test_duplicate/ 则,test duplicate下面将有abc/文件夹及其所有的文件。
若cp ./abc test_duplicate/ 则,test duplicate下面将有abc/文件夹及其所有的文件。
@CAT的功能
1.一次显示整个文件。$ cat filename
2.从键盘创建一个文件。$ cat > filename
3.清空一个已有的文件。$cat /dev/null > RedirectFile.txt
4.合并几个文件成一个文件并输出。输入文件按照排列顺序被打印,如果要调换信息的顺序,就必须调换输入文件的顺序。cat file1 file2 file3 >fileall
5.当需要处理的文件数目过大而无法手工输入文件名称时,可以使用通配符,如
cat chapter* > book将文件夹下所有chapter开头的文件合并到book文件中。
在使用通配符时,文件名将会按照升序排列。
6. cat -s file合并多行空白行为一个单独的空白行
cat -s file | sed '/^[[:space:]]*$/d'清除所有空白行
7. cat -b file对非空白行进行编号
8.cat -n file对所有行进行编号
@echo的格式
默认echo出argument之后还会echo一个换行符号。-n选项可以取消换行符号。
@nohup@
使得一个进程在后台运行可以采取的办法是
①nohup ctrl+z然后bg
②screen命令
③crontab
@crontab执行@
基本格式 :
*****command分 时 日 月 周 命令
第1列表示分钟1~59每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
30 21 * * */usr/local/etc/rc.d/lighttpd restart 1>/dev/null 2>&1
上面的例子表示每晚的21:30重启apache。
45 4 1,10,22 * */usr/local/etc/rc.d/lighttpd restart 1>/dev/null 2>&1
上面的例子表示每月1、10、22日的4 : 45重启apache。
10 1 * * 6,0/usr/local/etc/rc.d/lighttpd restart 1>/dev/null 2>&1
上面的例子表示每周六、周日的1 : 10重启apache。
0,30 18-23 * * */usr/local/etc/rc.d/lighttpd restart 1>/dev/null 2>&1
上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。
0 23 * * 6 /usr/local/etc/rc.d/lighttpdrestart 1>/dev/null2>&1
上面的例子表示每星期六的11 : 00 pm重启apache。
* */1 * * */usr/local/etc/rc.d/lighttpd restart 1>/dev/null 2>&1
每一小时重启apache
* 23-7/1 * * */usr/local/etc/rc.d/lighttpd restart 1>/dev/null 2>&1
晚上11点到早上7点之间,每隔一小时重启apache
0 11 4 * mon-wed/usr/local/etc/rc.d/lighttpd restart 1>/dev/null 2>&1
每月的4号与每周一到周三的11点重启apache
0 4 1 jan */usr/local/etc/rc.d/lighttpd restart 1>/dev/null 2>&1
一月一号的4点重启apache
@cut的用法
[@administer]# echo 11-22-33|cut-d"-" -f2,3
22-33
[@administer]# echo 11-22-33|cut-d"-" -f2,3|cut -d"-" -f1
22
注意管道符号前后有没有空格都会输出相同的显示结果
@head和tail@
head用来查看文件的头部10行,
tail用来查看文件的尾部10行。tail还可以用来跟踪文件的更新情况。
head
你可以通过head命令查看具体文件最初的几行内容,该命令默认是前10行内容,如果你想查看前面更多内容,你可以通过一个数字选项来设置,例如
head -20 install.log
通过上面命令你可以查看install.log这个文件前面20行的内容
与head命令相反,tail命令是用来查看具体文件后面几行的内容,默认情况下,是查看该文件尾10行的内容,同样,如果想查看后面更多内容,也是通过数字选项来设置,例如
tail -20 install.log
你还可以使用 tail 来观察日志文件被更新的过程。使用 -f 选项,tail 会自动实时
地把打开文件中的新消息显示到屏幕上。例如,要即时观察 /var/log/messages的变化,以根用户身份在 shell 提示
下键入以下命令:
tail -f /var/log/messages
@SORT@的参数@
输入tab键的方法 ctrl-v-i
cat FinalResult2.txt | sort-t' ' -k1,1 -k3,3 nr>FinalResult3.txt
注意排序依据大于一列时要写为sort-t' ' -k1,1 -k3,3nr,不能够写为sort -t' ' -k1-k3nr
@查看磁盘空间大小@
用法一 df -h
[@administer ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vgroot-lvroot
3.9G 482M 3.3G 13% /
/dev/mapper/vgroot-lvusr
4.9G 2.3G 2.4G 50% /usr
/dev/mapper/vgroot-lvvar
3.9G 427M 3.3G 12% /var
/dev/mapper/vgroot-lvopt
137G 79M 137G 1% /opt
/dev/cciss/c0d0p1 190M 19M 162M 11% /boot
tmpfs 6.9G 16K 6.9G 1% /dev/shm
/dev/cciss/c0d1p1 8.2T 7.3T 992G 89% /search
glusterfs#10.12.130.18
60T 49T 12T 81% /gfs
用法二
du -ch 看这个文件夹整体
du -chs 分开看此文件夹下面的所有小文件夹。
du --max-depth=1 分开看此文件夹下面的所有深度为1的小文件夹。
@top命令查看运行情况@
# top
top - 09:13:42 up 43 days, 16:32, 2 users, load average: 11.62, 26.60, 20.90
Tasks: 168 total, 2running, 166 sleeping, 0 stopped, 0 zombie
Cpu(s): 24.8%us, 3.2%sy, 0.0%ni, 69.4%id, 2.4%wa, 0.0%hi, 0.2%si, 0.0%st
Mem: 16443520k total,10953860k used, 5489660k free, 2540k buffers
Swap: 8388600k total, 8286076k used, 102524k free, 429984k cached
# ll /proc/13299
@改变文件或者文件夹的属主@
chown -R felicia:felicia./TempTask/
@rsync限制速度及显示详细信息@
rsync --bwlimit=1024 -v0.0.0.0::root/a/b/c/* ./
@chmod的使用
chmod u-x,go+rw linuxsir007.txt 注:减去文件属主对文件的执行权,增加属组和其它用户对文件的可读可写权;
@find与grep@
find用于查找文件系统中的指定文件,格式为find 要查找的路径 表达式
例如
find . -name 1.txt 在当前目录及其子目录下查找文件1.txt
find /tmp -name 1.txt 在/tmp 目录及其子目录下查找文件1.txt
grep命令用于查找指定的模式匹配格式为,grep [命令选项] 要查找的匹配模式 [要查找的文件]
例如
grep cams test.txt 在test.txt 文件中查找cams 字符串
grep -r cams /root/cams 在/root/cams 目录及其子目录下的所有文件中查找cams 字符串
grep 命令除了能够查找文件外还能够将任意输出流重定向到grep 进行查找
ps -ef | grep ora 查找进程名中包含ora 的所有进程信息
@pstree@
一般用到 pstree -ap 查看进程数(以详细方式查看,包括其中包含的命令和PID)
@杀掉一个进程@
PROCESS=`ps -ef|grepyourprocess|grep -v grep |awk '{print $2}'`
kill -9 $PROCESS
@杀掉父进程及其子进程@
[@administer_18_71 Scripts]#pstree -ap|grep Statistics.sh
| | |-grep,14231 Statistics.sh
| | `-sh,1642 Statistics.sh
[@administer_18_71 Scripts]#pstree -ap 1642
sh,1642 Statistics.sh
|-cat,1643 ../Data/adid_log.20120506
`-exe,1644 200000000300000 ../Data/pv_pvid.20120506 ../Data/cd_pvid.20120506
[@administer_18_71 Scripts]# kill1642 1644
[@administer_18_71Scripts]#
[1]+ Terminated nohup sh Statistics.sh
@SCREEN命令@
screen -S sessionid
ctrl+a d 退出刚创建的窗口(回到进入screen前的环境)
screen创建新的终端窗口
screen -ls可以看所有的screen sessions
screen -r sessionid可以进sessionid指定的特定的screen session,不再使用的时候exit退出即可
screen -d sessionid强制把一个session切换为detached状态
@字符串删除@
為了完整起見,我這裡再用一些例子加以說明 ${ }的一些特異功能:
假設我們定義了一個變量為:
@${ }@
file=/dir1/dir2/dir3/my.file.txt
我們可以用 ${ }分別替換獲得不同的值:
${file#*/}:拿掉第一條 /及其左邊的字串:dir1/dir2/dir3/my.file.txt
${file##*/}:拿掉最後一條 /及其左邊的字串:my.file.txt
${file#*.}:拿掉第一個 .及其左邊的字串:file.txt
${file##*.}:拿掉最後一個 .及其左邊的字串:txt
${file%/*}:拿掉最後條 /及其右邊的字串:/dir1/dir2/dir3
${file%%/*}:拿掉第一條 /及其右邊的字串:(空值)
${file%.*}:拿掉最後一個 .及其右邊的字串:/dir1/dir2/dir3/my.file
${file%%.*}:拿掉第一個 .及其右邊的字串:/dir1/dir2/dir3/my
記憶的方法為:
# 是去掉左邊(在鑑盤上 #在 $ 之左邊)
% 是去掉右邊(在鑑盤上 %在 $ 之右邊)
單一符號是最小匹配﹔兩個符號是最大匹配。
${file:0:5}:提取最左邊的 5個字節:/dir1
${file:5:5}:提取第 5個字節右邊的連續 5個字節:/dir2
${file/dir/path}:将第一个dir提换为path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部dir提换为path:/path1/path2/path3/my.file.txt
@用touch来改变文件的修改时间@
例一 touch -m FILE1 -r FILE2 把FILE1的时间修改为FILE2的时间
例一 touch -m Feature.cpp -r config.cpp
例二 touch -m FILE1 -t TIME(YYYYMMDDHHMM) 用TIME所指定的时间去修改FILE1的时间
例二 touch -m Feature.cpp -t 201211052230