linux shell脚本攻略

第一章 小试牛刀

echo 后面可以直接跟内容,或者用单引号和双引号

1.单引号中的变量不会被解析,比如echo '$aa' 结构就是 $aa

2.不带引号时,echo hello;hello  的第二个hello会被当做命令执行

C代码   收藏代码
  1. echo -n 忽略换行  
  2. echo -e 输出的内容会被转移  

    printf 

C代码   收藏代码
  1. %-5s  打印字符串,- 表示左对齐,不到5位的用空格替代  
  2. $s格式化字符串,%c是替换字符,%d是数字,%f是浮点数  

输出带色彩的文件和背景

C代码   收藏代码
  1. echo -e "\e[1;45m \e[1;31m sssssssssssssss \e[0m"   

 

变量的一些简单实用

C代码   收藏代码
  1. var=hello  
  2. 输出var变量  
  3. echo $var  
  4. echo ${var}  
  5.    
  6. 求字符串长度  
  7. echo ${#var}  
  8.    
  9. 当前的shell版本  
  10. echo $SHELL  
  11. echo $0  

 

数学运算

C代码   收藏代码
  1. let var++   #执行let时候变量前面不需要加$符号  
  2. echo $var  
  3. result=$[no1 + no2]      #[]中也可以使用$前缀  
  4. result=$[$no1 + 5]  
  5. result=$(( no1 + 5 ))    #()这种写法时,变量前必须加上$  
  6. echo "4*3.14" | bc       #只有bc才支持浮点运算  

 

调用一个shell有两种方式,调用一个shell执行然后得到它的返回值

C代码   收藏代码
  1. result=`expr 3+4`  
  2. result=$(exprt $no1+5)  

 

 

输入输出

C代码   收藏代码
  1. 0    stdin(标准输入)  
  2. 1    stdout(标志输出)  
  3. 2    stderr(标志错误)  
  4. > 等同于1>; >>等同于1>>  
  5. echo "hello " 2>&1 out.log  
  6. echo "hello"  &> out.log  

 

自定义文件描述符(注意 > 符号和数字之间不能有空格)

C代码   收藏代码
  1. echo "this is new line" > input.txt  
  2. exec 3
  3. cat <&3  
  4. exec 4 > out.txt  
  5. echo "new line" >& 4  
  6. exec 5>>input.txt   
  7. echo "append" >&5  
  8. echo "aaa" 2> /dev/null     #错误输出重定向到黑洞文件  

 

数组

C代码   收藏代码
  1. array_var=(1,2,3,4,5,6)  
  2. array_var[0]="test1"  
  3. array_var[1]="test2"  
  4. array_var[2]="test3"  
  5. echo $(array_var[0])  
  6. echo $(array_var[$index])    #假设index=5  
  7. echo $(array_var[@])  
  8.     结果: test1 test2 test3 test4 test5 test6  
  9. echo $(#array_var[*])        #打印数组长度  

 

关联数组

C代码   收藏代码
  1. declare -A ass_array  
  2. ass_array=(([index1]=val-1 [index2]=val-2))  
  3. 或者:  
  4. ass_array[index1]=val-1  
  5. ass_array[index2]=val-2  
  6. fruits_value=( [apple]='100 dollars' [orage]='150 dollars' )  
  7.     列出数组索引  
  8. echo $(!array_var[*])  
  9. echo $(!array_var[@])  
  10.   
  11.  语法               描述  
  12.  ${!array[*]}    取关联数组所有键  
  13.  ${!array[@]}    取关联数组所有键  
  14.  ${array[*]}     取关联数组所有值  
  15.  ${array[@]}     取关联数组所有值  
  16.  ${#array[*]}    关联数组的长度  
  17.  ${#array[@]}    关联数组的长度  
    

 

别名

C代码   收藏代码
  1. alias rm='cp $@ ~/backup; rm $@'  
  2. 可以将其放入到 ~/.bashrc文件中,新的shell进程就会生效,删除可以从这个文件中删除或者使用  
  3. unalias命令  

 

时间

C代码   收藏代码
  1. sleep 秒  
  2. usleep 微妙(百万分之一秒)  
  3. date,格式化字符串  
  4. 星期    %a(简写) %A(完整)  
  5. 月      %b(简写) %B(完整)  
  6. 日      %d  
  7. 年      %y(两位表示)  %Y(四位表示)  
  8. 小时    %H  
  9. 分钟    %M  
  10. 秒      %S  
  11. 纳秒    %N  
  12. 时间戳  %s  

 

调试

C代码   收藏代码
  1. sh -x script.sh  
  2. set -x: 在执行时显示参数和命令  
  3. set +x: 禁止调试  
  4. set -v: 当命令进行读取时显示输入  
  5. set +v: 禁止打印输入  
  6.   
  7. function DEBUG() {  
  8.     [ "$_DEBUG" == "on" ] && $@ || :  
  9. }  
  10. 可以将调试功能设置为on来运行脚本  
  11. _DEBUG=ON ./scritp.sh  
  12. DEBUG函数中的 :  告诉shell不要执行任何操作  
  13. 把 #! /bin/bash 改成 #! /bin/bash -xv 这样不用其他任何选项就可以启用调试功能了  

 

函数

C代码   收藏代码
  1. 调用函数方式    
  2. myfun ;  
  3. 传递参数  
  4. myfun arg1 arg2 ;  
  5. 参数可以传递给脚本并通过$0(脚本名) 访问  
  6. $1 第一个参数  
  7. $2 第二个参数  
  8. $n 第n个参数  
  9. $@ 被扩展成 "$1" "$2"  "$3" 等  
  10. $* 被扩展成 "$1c$2c$3"等  
  11. $@用的最多,由于$*将所有参数当做单个字符串因此很少被使用  
  12.   
  13. 导出函数,之后函数的作用域就可以扩展到子进程中  
  14. export -f myfun     
  15.   
  16. 读取命令返回值(状态)  
  17. cmd;  
  18. echo $?  
  19. 利用()可以生成子shell,子shell中执行的内容不会对父shell产生影响  
  20. pwd;  
  21. (cd /bin; ls)  

 

从控制台读取

C代码   收藏代码
  1. read -n number_of_chars variable_name    #从输入中读取n个字符并存入变量variable_name中  
  2. read -s var                     #用不回显的方式去读密码  
  3. read -p "enter input :" var     # 显示提示信息  
  4. read -t timeout var             #在特定的时间内读取输入read -t 2 var 两秒内输入  
  5. read -d delim_char var          #用定界符结束输入行 read -d ":" var    
  6. #输入hello:  var被设置为hello  

 

分隔符

C代码   收藏代码
  1. 读取/etc/passwd,打印出用户默认的shell  
  2. line="root:x:0:0:root:/root:/bin/bash"  
  3. oldIFS=$IFS  
  4. IFS=":"  
  5. count=0  
  6. for item in $line;  
  7. do  
  8.     [ $count -eq 0 ] && user=$item;  
  9.     [ $count -eq 6 ] && shell=$item;  
  10.     let count++  
  11. done;  
  12. IFS=$oldIFS  
  13. echo $user\'s shell is $shell  
  14. 结果: root's shell is /bin/bash  
  15. echo {1..50}          #能够生产从1到50的数字列表  
  16. echo {a..z}或者{A..Z},或者使用{a..h}生产部分列表  
  17. for i in {a..z} do action; done;  
  18.   
  19.     for循环  
  20. for var in list;  
  21. do  
  22.     command;  
  23. done  
  24.   
  25.     采用c语言中的for循环格式  
  26. for((i=0;i<10;i++)) {  
  27.     commands;  
  28. }  
  29.   
  30.     while循环  
  31. while condition  
  32. do  
  33.     command;  
  34. done  
  35. true作为循环条件能够参数无限循环  
  36.   
  37.     until循环(它会一直执行循环直到给定的条件为真)  
  38. x=0;  
  39. unitl [ $x -eq 9 ];   
  40. do  
  41.     let x++;  
  42.     echo $x;  
  43. done  

 

比较

C代码   收藏代码
  1. if condition;then  
  2.     commands;  
  3. fi  
  4.   
  5. if condtion;then  
  6.     commands;  
  7. elif condtion;then  
  8.     commands;  
  9. else  
  10.     commands;  
  11. fi  
  12. 条件通常被放置在封闭的中括号内,一定要注意在[或]与操作数之间有一个空格,如果忘记空格脚本就  
  13.   
  14. 会报错  
  15.       
  16.     一些重要的操作符:  
  17. -gt    大于  
  18. -lt    小于  
  19. -ge    大于或等于  
  20. -le    小于或等于  
  21. -eq    等于  
  22. -nq    不等于  
  23.       
  24.     文件系统相关测试  
  25. [ -f $file_var ]    如果给定的变量包含正常的文件路径或文件名则返回真  
  26. [ -x $var ]         如果给定的变量包含的文件可执行,则返回真  
  27. [ -d $var ]         如果给定的变量包含的是目录,则返回真  
  28. [ -e $var ]         如果给定的变量包含的文件存在,则返回真  
  29. [ -c $var ]         如果给定的变量包含的是一个字符设备文件的路径,则返回真  
  30. [ -b $var ]         如果给定的变量包含的是一个块设备文件的路径,则返回真  
  31. [ -w $var ]         如果给定的变量包含的文件可写,则返回真  
  32. [ -r $var ]         如果给定的变量包含的文件可读,则返回真  
  33. [ -L $var ]         如果给定的变量包含的是一个符号链接,则返回真  
  34.   
  35.     字符串比较(因为有时候采用单个中括号会产生错误,最好使用双个中括号)  
  36. 注意在 = 前后各有一个空格,如果忘记加空格,那就不是比较关系了,而变成赋值语句了   
  37. [[ $str1 = $str2 ]   
  38. [[ $str1 == $str2 ]  
  39. [[ $str1 != $str2 ]  
  40. [[ $str1 > $str2 ]        #str1的字母序比str2大  
  41. [[ $str1 < $str2 ]   
  42. [[ -z $str1 ]]            #如果str1包含的是空字符串,则返回真  
  43. [[ -n $str1 ]]            #如果str1包含的是空字符串,则返回真  

 

 

 

 

 

第二章 命令之乐

 cat相关

C代码   收藏代码
  1. cat file1 file2 file3      #将多个文本内容拼接在一起  
  2. OUTPUT_FROM_SOME COMMANDS | cat    #从表中输入中读取  
  3. echo 'from stdin' | cat - file.txt  
  4. cat -s file                #压缩空白行  
  5. cat -T file.py             #将制表符显示为 ^|  
  6. cat -n file.txt            #显示行号  

 

录制和回放终端会话

C代码   收藏代码
  1. script  
  2. scriptreplay  

 

 文件查找

C代码   收藏代码
  1. find base_path       #base_path 可以是任何位置  
  2. -print  指明打印出匹配的文件名(路径)  
  3. -print0 指明使用'\0'作为定界符来打印每一个匹配的文件名  
  4. -name   后面的参数可以包含正则表达式,指定了文件名所必须匹配的字符串  
  5. -iname  类似-name,但是忽略大小写,如果有多个匹配条件可以用OR,也可以用!否定参数的含义  
  6.     find . \(-name "*.txt" -o -name "*.pdf" \) -print  
  7.     find . ! -name "*.txt" -print    #打印所有不以.txt结尾的文件  
  8. -regex  支持正则表达式  
  9. -iregix 忽略大小写  
  10.     find . -iregex ".*\(\.py\|\.sh\)$"     #忽略大小写找到所有py和sh结尾的文件  
  11. -maxdepth  深度搜索,最多搜索多少层  
  12. -mindepth  深度搜索,最少搜索多少层  
  13.     find . -maxdepth 1 -type f -print   #从性能角度来说,最好先指定深度再确定类型  
  14. -type      搜索文件类型  
  15.     普通文件    f  
  16.     符号链接    l  
  17.     目录        d  
  18.     字符设备    c  
  19.     块设备      b  
  20.     套接字      s  
  21.     fifo        p  
  22. -atime      用户最近一次访问文件的时间,可以带上 + 和 - 表示大于和小于  
  23. -mtime      文件内存最后一次被修改的时间  
  24. -ctime      文件元数据(metadata,列如权限  或所有权)最后一次改变的时间     
  25.     find . -type f -atime -7 print      #打印出最近七天内被访问过的所有文件  
  26.     find . -type f -atime 7 print       #打印出恰好在七天前被访问过的文件  
  27.     find . -type f -atime +7 print      #大餐饮出访问时间超过七天的所有文件  
  28. -amin       访问时间,以分钟为单位  
  29. -mmin       修改时间,以分钟为单位  
  30. -cmin       变化时间,以分钟为单位  
  31.     find . -type f amin +7 -print       #打印出访问时间超过7分钟的所有文件  
  32. -newer      指定一个用户比较时间长的参考文件,然后找出比参考文件更新的(更长修改时间)文件  
  33.     find . -tpe f -newer file.txt -print  
  34. -size       根据文件大小搜索  
  35.     b      块(512字节)  
  36.     c      字节  
  37.     w      字(2字节)  
  38.     k      千字节  
  39.     M      兆字节  
  40.     G      吉字节  
  41.     find . -type f -size +2k               #大于2k的文件  
  42. -delete     用来删除find查找到的匹配文件  
  43.     find . -type f -name "*.swp" -delete   #删除当前目录下所有.swp文件  
  44. -perm       根据文件权限和所有权查找(-user 可以指定用户)  
  45.     find . -type f -perm 644 -print        #打印出权限位644的文件  
  46.     find . -type f -user testuser -print   #打印出所有testuser用户的文件  
  47. -prune      跳过指定的目录  
  48.     find /data0/source_path \( -name ".git" -prune \) -o \( -type f -print \) #忽略git文件  
  49. -exec       可以与其他命令结合(但是只能执行一个命令)  
  50.     find . -type f -user root -exec chown testuser {} \;  
  51.     #上面的语句是找到所有root所有者的文件修改为testuser,对于每一个匹配的文件{}会被替换成  
  52.     #相应的文件名,如果找到两个文件file1.txt和file2.txt那么会执行  
  53.     chown testuser file1.txt  
  54.     chown testuser file2.txt  
  55.       
  56.     find . -type f -name "*.c" -exec cat {} \;>all_c_files.txt  
  57.     #上面的命令是将所有c程序文件拼接起来写入单个文件all_c_files  
  58.       
  59.     find . -type f -mtime +10 -name "*.txt" -exec cp {} OLD \;  
  60.     #上面的命令将10天前的.txt文件复制到OLD目录中  
  61.   
  62.     find . -type f -exec ./commands.sh {} \;  
  63.     #虽然-exec 参数无法使用多个命令,但是可以执行一个脚本,在脚本中放入多个命令  
  64.   
  65.     find . -type f -name "*.txt" -exec printf "Text file : %s\n" {} \;  
  66.     #-exec能够同printf结合起来生产有用的输出信息  

 

玩转xargs

C代码   收藏代码
  1. xargs命令把从stdin接收到的数据重新格式化,再将其作为参数提供给其他命令  
  2.     -n 参数表示将输入的内容转换为指定的行  
  3.     cat example.txt | xargs -n 3     #将example.txt的内容转换为3行  
  4.   
  5.     -d作为定界符  
  6.     echo "splitXsplitXsplitXsplit" | xargs -d X -n 2  
  7.     #结果: split split   
  8.            split split  
  9.     假设args.txt内容如下:  
  10.     arg1  
  11.     arg2  
  12.     arg3  
  13.   
  14.     -I选项指定一个替换字符串,这个字符串在xargs扩展时会被替换掉。当-I与xargs结合使用时,  
  15.     对于每一个参数,命令都会被执行一次  
  16.     cat args.txt | xargs -I {} ./echo.sh -p {} -x  
  17.     结果为:  
  18.     ./echo.sh -p arg1 -x  
  19.     ./echo.sh -p arg2 -x  
  20.     ./echo.sh -p arg3 -x  

 

 用tr进行转换

C代码   收藏代码
  1. tr 输入部分 [需要转换的部分] [转换后的部分]  
  2. echo "hello world hehe 1234 aa" | tr 'a-z' 'A-Z'  
  3. #结果: HELLO WORLD HEHE 1234 AA  
  4.   
  5. 压缩字符  
  6. echo "gun is not unix " | tr -s ' '       #将连续的字符压缩成单个字符  
  7.   
  8. 删除  
  9. echo "hello world hehe 1234 aa" | tr -d '0-9'  
  10. #结果: hello world hehe  aa  
  11.   
  12. 补集,比如下面这个列子,将不在 0-9,空格,回车中的字符全部删除  
  13. echo hello 1 char 2 next 4 | tr -d -c '0-9 \n'  
  14. #结果: 1 2 4  

 

校验和核实

C代码   收藏代码
  1. md5sum file    #创建一个文件的指纹,并将字符串打印到控制台上  
  2. md5sum file > check.md5  
  3. #生成的内容  
  4. 65466125197978378ec6340989ac50db  check.log  
  5. md5sum -c check.md5  #对文件进行校验      
  6.   
  7. sha1sum file    #创建一个文件的指纹,并将字符串打印到控制台上  
  8. sha1sum file > check.sha1  
  9. #生成的内容  
  10. 3acec0d3b6e19f68c4d25de104eabb25d5c982d2  checkfile.log  
  11. sha1sum -c check.sha1  #对文件进行校验  

 

排序

C代码   收藏代码
  1. sort -n 按数字进行排序  
  2. sort -r 逆序排序  
  3. sort -M 按照月份排序,一月,二月,三月这样的顺序  
  4. sort -C 测试一个文件是否已经被排序过  
  5. sort -m sorted1 sorted2   合并两个排序过的文件,而且不需要对合并后的文件再进行排序  
  6. sort -k 指定了排序应该按照哪一个键来排序  
  7. sort -b 忽略文件中的前导空白字符  
  8. sort -d 按照字典排序  
  9. sort -o file.log 将排序结果输出到指定文件中  
  10. sort -u 文件去重  
  11. #用法  
  12. sort -C file  
  13. if [ $? -eq 0 ];then  
  14.     echo sorted  
  15. else  
  16.     echo unsorted  
  17. fi  

 

单一与重复

C代码   收藏代码
  1. uniq命令可以消除重复的内容,但必须用于排序过的数据,一般和sort命令结合使用  
  2. uniq -u sorted.txt    只显示唯一的行(在输入文本中没有出现重复的行)  
  3. uniq -c sorted.txt    统计各行在文件中出现的次数  
  4. uniq -s 2 sorted.txt  指定可以跳过前N个字符  
  5. uniq -w 2 sorted.txt  指定用于比较的最大字符串  
  6. uniq -z file.txt      为每行最后添加\0值字符  

 

临时文件与随机数

C代码   收藏代码
  1. echo $RANDOM    #每次都会返回一个随机数  
  2. temp_file="/tmp/file-$RANDOM"  
  3. tmpe_file="/tmp/var.$$" # $$表示当前进程的id  

 

文件分割

C代码   收藏代码
  1. split -b 10k data.file  
  2. ls  
  3. #结果为: data.file xxa xab xac ... axj   xa开头的一共10个文件  
  4. split -d 指定数字为后缀  
  5. split -a 4 指定后缀长度  
  6. split -b 10k data.file -d -a 4  
  7. split [command_args] prefix  分割的文件前缀  

 

根据扩展名切分文件名

C代码   收藏代码
  1. file_jpg="sample.jpg"  
  2. echo ${file_jpg%.*}    #输出sample  
  3. echo ${file_jpg#*.}    #输出jpg  
  4.   
  5. ${VAR%.*}  表示删除位于%右侧的通配符(也就是 .* ),通配符从右向左进行匹配 这种是非贪婪形的  
  6. ${VAR%%.*} 从右向左执行贪婪操作匹配  
  7. file=hack.fun.book.txt  
  8. ${file%%.*} 输出为hack  
  9.   
  10. ${VAR#*.}  是从左向右匹配,删除位于#右侧的通配符(也就是 *. )  
  11. ${VAR##*.} 是贪婪匹配,从左向右删除变量中匹配的结果  
  12. file=hack.fun.book.txt  
  13. ${file##*.}  结果是txt  

  

批量重命名和移动

C代码   收藏代码
  1. count=1;  
  2. for img in *.jpg *.png  
  3. do  
  4.     new=image-$count.${img##*.}  
  5.     mv "$img" "$new" 2> /dev/null  
  6.   
  7.     if [ $? -eq 0 ];then  
  8.         echo "renaming $img to $new"  
  9.         let count++  
  10.     fi  
  11. done  

 

 

 

 

 

第三章 以文件之名

生成任意大小的文件

C代码   收藏代码
  1. dd if=/dev/zero of=/junk.data bs=1M count=1  
  2.     if是input file  
  3.     of是output file  
  4.     bs是block size  
  5.     count代表需要被复制的块数  
  6.     块的大小定义如下:  
  7.     字节(1B)  c  
  8.     字(2B)   w  
  9.     块(512B) b  
  10.     1k      k  
  11.     1m      M  
  12.     1g      G  

 

文件的交集与差集

C代码   收藏代码
  1. cat a.log  
  2. apple  
  3. gold  
  4. iron  
  5. orange  
  6. silver  
  7. steel  
  8.   
  9. cat b.txt  
  10. carrot  
  11. cookies  
  12. gold  
  13. orange  
  14.   
  15. comm a.log b.log  
  16. 结果:  
  17. apple  
  18.         carrot  
  19.         cookies  
  20.                 gold  
  21. iron  
  22.                 orange  
  23. silver  
  24. steel  
  25.   
  26. 第一列是只在a.log中出现的  
  27. 第二列是只在b.log中出现的  
  28. 第三列是同时在a.log和b.log中出现的  
  29. comm a.log b.log -1      #删除第一列  
  30. comm a.log b.log -2  #删除第一列  
  31. comm a.log b.log -3  #删除第一列  
  32. comm a.log b.log -1 -2   #删除第一和第二列  

 

查找并删除重复文件

C代码   收藏代码
  1. #! /bin/bash  
  2. ls -lS | awk 'BEGIN{  
  3.     getline;getline  
  4.     size=$5; lastName=$9  
  5. }  
  6. {  
  7.     currentName=$9  
  8.     if(size==$5) {  
  9.         "md5sum "lastName | getline;  csum1=$1;  
  10.         "md5sum "currentName | getline; csum2=$1;          
  11.         if(csum1==csum2) {  
  12.             print lastName  
  13.             print currentName                                  
  14.         }  
  15.     };  
  16.     size=$5  
  17.     lastName=currentName  
  18. } ' | sort -u > dup_file  
  19. cat dup_file | xargs -I {} md5sum {} | sort | uniq -w 32 | awk '{ print $2 }' | sort -u > dup_sample_file  
  20. comm dup_file dup_sample_file -2 -3 | tee /dev/stderr | xargs rm  
  21.   
  22. #首先获得文件列表然后遍历并按大小排序,获取文件大小和文件名,如果文件大小相同再比较两个文件  
  23. #的MD5值。如果MD5值相同那么肯定是重复的文件,把这两个文件名打印出来,最后重定向到dup_file中  
  24. #之后cat这个文件再对每行(也就是每个重复的文件)计算MD5值并排序(只比较前32个字节),最后去重  
  25. #只打印一个重复的文件并重定向到dup_sample_file中  
  26. #最后用comm比较dup_file和dup_sample_file,打印出只在dup_file中出现的文件,并用tee打印到标准  
  27. #错误输出中,最后交给xargs 删除这些文件  
  28.   
  29. #其中上面的功能只需要一行就可以完成了  
  30. ll | awk 'BEGIN{getline} {print $9}' | xargs -I {} md5sum {} | uniq -w 32 -D | awk 'BEGIN{getline}{print $2}' | xargs -I {} rm {}  
  31. #awk中的getline是读取一行,ll的第一行内容不需要所以只读取然后忽略即可,之后用对每个文件做  
  32. #MD5,然后比较前32个字节,打印出所有重复的文件名,之后再用awk,忽略掉第一行(从第二行开始读)  
  33. #然后交给xargs最后删除这些重复文件  

 

文件权限 所有者和粘滞位

C代码   收藏代码
  1. ls的第一位  
  2. -   普通文件  
  3. d   目录  
  4. c   字符设备  
  5. b   块设备  
  6. l   符号链接  
  7. s   套接字  
  8. p   管道  
  9. 之后是9个权限位rwxrwxrwx,用户,组,其他  
  10. 对于用户来说有一个suid位,-rwS------ setuid权限允许用户以其他拥有者的权限来执行可执行文件  
  11. 对于组用户有一个sgid位,----rwS---   setgid位允许以同该目录拥有者所在组相同 的有效组权限来执行文件  
  12. 目录有一个特殊权限,叫粘滞位。当一个目录设置了粘滞位,只有创建该目录的用户才能删除目录中的文件,即使其他用户和组用户有权限也不行。  
  13. 粘滞位出现在其他用户执行的执行权限位置(x),使用t或者T表示,如果没有设置执行权限,但设置了粘滞位则使用t表示;如果同时设置了执行权限和粘滞位就使用T表示  
  14.   
  15. chmod a+t directory_name   #设置粘滞位     
  16. chmod 777 . -R             #递归执行  
  17. chmod +s executeable_file  #设置sid位  

 

批量生成空文件 创建不可修改文件

C代码   收藏代码
  1. touch file  
  2. for name in {1..100}.txt  
  3. do  
  4.     touch name  
  5. done  
  6. touch -a 只更改改文件的访问时间(access time)  
  7. touch -m 只更改文件内容修改时间(modification time)  
  8. touch -d 为文件指定特定的时间戳  
  9. touch -d "Jan 20 2010"  
  10. chattr -i file   #设置不可删除的文件  

 

查找符号链接及指向

C代码   收藏代码
  1. ll | grep "^l" | awk '{print $9 " " $10 " " $11}'  
  2. find -type l | xargs readlink   

 

 

列举文件类型统计信息 

C代码   收藏代码
  1. #遍历一个目录下的文件类型,并打印出这种文件类型出现的次数  
  2. #下面这段代码是书中提供的,但是有问题不知道如何修改  
  3. #! /bin/bash  
  4.   
  5. if [ $# -ne 1 ];then  
  6.     echo $0 bashpath;  
  7.     echo  
  8. fi  
  9. path=$1  
  10.   
  11. declare  statArray  
  12. find $path -maxdepth 1 -print | while read line  
  13. do  
  14.     ftype=`file -b $line`  
  15.     let "statArray[$ftype]"++ ;  
  16. done  
  17.   
  18. for ftype in "${!statArray[@]}"  
  19. do  
  20.     echo $ftype : ${statArray["$ftype"]}  
  21. done  
  22.   
  23.   
  24. #上面的功能用一行就看以完成了  
  25. find /root -maxdepth 1 -print | xargs -I {} file -b {} | awk '{sum[$0]++} END{ for(i in sum){print i "\t" sum[i]} }'  

 

环回文件与挂载

C代码   收藏代码
  1. dd if=/dev/zero of=loopback.img bs=10m count=1  
  2. mkfs.ext3 loopback.img  
  3. sudo mkdir /mnt/loopback  
  4. mount -o loop lopback.img /mnt/loopback  
  5. mount -t ext4 /dev/sdb1 /data1      #挂载一个分区  

 

文件补丁

C代码   收藏代码
  1. diff version1.txt version2.txt  
  2. #显示差异  
  3.   
  4. #-u用做生成一体化输出,并将结果重定向到patch文件中  
  5. diff -u version1.txt version2.txt > version.patch  
  6.   
  7. #给version1打补丁后就变成了version.txt  
  8. patch -p1 version1.txt < version.patch  
  9.   
  10. #再打一次补丁就还原回version1了,此时会出现是提示,是否需要继续执行  
  11. patch -p1 version1.txt < version.patch  

 

 

head和tail

C代码   收藏代码
  1. head file            #默认打印前10行  
  2. head -n 5 file       #打印前5行  
  3. head -n -5 file      #打印除了最后5行外的所有行  
  4. tail file        #打印最后10行  
  5. tail -n 5 file       #打印最后5行  
  6. tail -n +5 file      #打印除了前5行外的所有行  
  7. seq 100 | tail -n +20   #seq 100 会打印出1到100个数字,每打印一次会换行  
  8. dmegs | tail -f  
  9. PID=${pidof Foo}  
  10. tail -f file --pid $PID    #当进程Foo结束后,tail也会跟着结束  

 

只列出目录

C代码   收藏代码
  1. ls -D  
  2. ls -F    #对于目录会增加/ 结尾,对于文件增加 * 结尾  
  3. ls -F /home | grep "/$"   #查找/home目录的所有文件,以/ 结尾的  
  4. ls -l /home | grep "^d"  
  5. find /home -type d -maxdepth 1 -print  

  

 

在命令行中用pushd和popd快速定位

C代码   收藏代码
  1. pushd可以在多个目录中快速的定位  
  2. pushd /data0/test/mydir  
  3. pushd /home/hehe/test  
  4. pushd /var/log/test  
  5. pushd /test/dir  
  6. 位置从0开始  
  7. dirs /test/dir /var/log/test /home/hehe/test /data0/test/mydir  
  8. pushd +0 就是/test/dir表示在这个目录不动  
  9. pushd +1 就是切换到/var/log/test  
  10. popd 是弹出最上面的目录  
  11. popd +n 弹出第n个目录,它也是从下标0开始计算的  
  12. popd +1 表示弹出/var/log/test  
  13.   
  14. 如果只有两个目录/data0/test和/home/hehe  
  15. 先cd到/data0/test再cd到/home/hehe  
  16. 如果想切回到/data0/test  
  17. 执行cd -   即可,再切换到/home/hehe,再执行一次 cd -  
  18. 不停的执行cd -  就可以在两个目录之间切换了  

 

统计文件的行数 单词数和字符数

C代码   收藏代码
  1. wc -l file    #统计行数  
  2. wc -w file    #统计单词数  
  3. wc -c file    #统计字符数  
  4. wc file       #打印出文件的行数,单词数和字符数  
  5. wc file -L    #打印最长行的长度  

 

打印目录树

C代码   收藏代码
  1. tree  
  2. tree -P "*.jpg"     #用通配符描述样式  
  3. tree -L [path]      #指定递归的目录深度  
  4. tree --inodes       #列出文件并显示这个文件的inode  
  5. tree -d [path]      #只显示目录  
  6. tree -s [path]      #列出文件并显示大小(字节)  
  7. tree -D [path]      #列出文件并显示修改时间  
  8. tree -H [path]      #以HTML格式打印  
  9. tree -o file [path] #结果重定向到文件中  

 

 

 

 

 

第四章 让文本飞

正则表达式

C代码   收藏代码
  1. ^   行起始标记       ^tux 匹配以tux起始的行  
  2. $   行尾标记        tux$ 匹配以tux结尾的行  
  3. .   匹配任意一个字符    Hack.匹配Hack1和Hacki,但是不匹配Hackl2和Hackil  
  4. []  包含在[]之中任意字符 cook[kl]匹配cook或cool  
  5. [^] 匹配除^之外任意字符  9[^01]匹配92,93但是不匹配91或90  
  6. [-] 匹配[]中指定范围任意字符   [1-5]匹配从1~5的任意一个数字s  
  7. ?   匹配之前的项1次或0次 colou?r 匹配color或者colour,但不能匹配colouur  
  8. +   匹配之前的项目1次或多次    Rollno-9+ 匹配Rollno-99,Rollno-9  
  9. *   匹配之前的项0次或多次 co*l匹配cl,col,coool等  
  10. ()  创建一个用于匹配的字串 ma(tri)? 匹配max或maxtrix  
  11. {n} 之前的项匹配n次        [0-9]{3}匹配任意一个三位数,[0-9][0-9][0-9]  
  12. {n,m}   指定之前的项所必须匹配的最小和最大次数 [0-9]{2,5}匹配从两位数到五位数之间任意一个  
  13. |   交替--匹配 | 两边任意一项 Oct(1st|2nd) 匹配Oct1st或0ct2nd  
  14. \   转移符可以将特殊字符进行转移  a\.b匹配a.b  
  15.   
  16. \b  单词边界            \bcool\b 匹配cool,但不匹配coolant  
  17. \B  非单词边界           cool\B 匹配coolant,但不匹配cool  
  18. \d  单个数字字符          b\db匹配b2b,但不匹配bcb  
  19. \D  单个非数字字符         b/Db匹配bcb,但不匹配b2b  
  20. \W  单个单词字符(字母数字下划线) \w匹配1或a,但不匹配&  
  21. \W  单个非单词字符         \W匹配&,但不匹配1或a  
  22. \n  换行符             \n匹配一个新行  
  23. \s  单个空白字符          X\sx匹配x x,但不匹配xx  
  24. \S  单个非空白字符         x\Sx匹配xx,但不匹配x x  
  25. \r  回车              匹配回车  
  26.   
  27.   
  28. #匹配一个IP地址  
  29. [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.  

 

用grep搜索

C代码   收藏代码
  1. grep match_pattern filename  
  2. grep "match_pattern" filename  
  3. echo -e "this is a wordl\ntext line" | grep word  
  4. grep "match_text" file1 file2 file3 ...     #对多个文本进行搜索  
  5. grep word filename --color=auto         #对输出行中重点标记处匹配到的单词  
  6. grep -E "[a-z]+"    #使用扩展正则表达式  
  7. egrep "[a-z]+"      #功能同上  
  8. grep -v "match_pattern" file        #打印除包含match_pattern的行之外的所有行  
  9. grep -c "text" filename         #统计文本或文件中包含匹配字符串的行  
  10. echo -e "1 2 3 4\nhello\n 5 6" | egrep -c "[0-9]"   #统计匹配的行的数量,不是次数  
  11. grep linux -n sample.txt    #打印出包含匹配字符串的行数  
  12. echo gnu is not unix | grep -b -o "not"     #打印样式匹配所位于的字符或字节偏移  
  13. #结果 7:not  
  14.   
  15. grep "text" . -R -n     #在多级目录中对文本进行递归搜索   .  指定了当前的目录  
  16. echo "hello world" | grep -i "HELLO"    #忽略大小写  
  17. grep -e "pattern1" -e "pattern2"    #匹配多个样式  
  18. grep -f pattern_file  filename      #用-f读取一个匹配样式文件  
  19. grep "main()" . -r --include *.{c,cpp}      #在目录中只递归搜索.c和.cpp文件  
  20. grep "main()" . -r --exclude "README"       #在搜索中排除搜油的README文件  
  21. grep --exclude-dir      #排除目录  
  22. grep --exclude-from FILE    #排除所需的文件列表  
  23. grep -q             #静默输出,可以用于 if [ $? -eq 0 ]; 来判断  
  24. seq 10 | grep 5 -A 3        #打印某个匹配结果之后的3行  
  25. seq 10 | grep 5 -B 3        #打印某个匹配结果之前的3行  
  26. seq 10 | grep 5 -C 3        #打印某个结果之以及之后的3行  

 

用cut按列切分文件

C代码   收藏代码
  1. cut -f FIELD_LIST filename  
  2. cut -f 2,3 filename     #默认按照空格分隔,读取第二第三列  
  3. cut -d ";"      #指定定界符  
  4. cut -c 1-5 range_file.txt   #打印第一到第五个字符  
  5. cut -f      #表示定义字符安  
  6. cut -b      #表示定义字节  

 

统计特定文件中的词频

C代码   收藏代码
  1. egrep -o "[a-zA-Z]+" $filename | awk '{count[$0]} END{printf("%14s%s\n""WORD""COUNT")}   
  2. for(ind in count){printf("%-14s%d\n",ind,count[ind])} '  

 

sed入门

C代码   收藏代码
  1. sed 's/pattern/replace_string/' file    #替换  
  2. sed -i 's/pattern/replace/' file    #使用-i,可以替换原文件  
  3. sed 's/pattern/replace/g' file      #替换所有处  
  4. sed '/pattern/p'                        #打印匹配的内容  
  5. echo this thisthisthis | sed 's/this/THIS/2g'       #从第N+1处开始替换  
  6. #this THISTHISTHIS  
  7.   
  8. echo this this this this | sed 's/this/THIS/3g'   
  9. #this this THIS THIS  
  10.   
  11. echo this this this this | sed 's/this/THIS/4g'  
  12. #this this this THIS  
  13.   
  14. #移除空白行  
  15. sed '/^$/d'     # d 是删除  
  16. echo this is an example | sed 's/\w\+[&]/g' #用 & 标记匹配样式的字符串  
  17. [this] [is] [an] [example]          #能够在匹配字符串时使用已匹配的内容  
  18.   
  19. echo this is digit 7 in a number | sed 's/digit\([0-9]\)/\1/'  
  20. #上面这个命令将digit 7替换为7,\(pattern\) 用于匹配子串,对于匹配的第一个子串对应的标记是  
  21. # \1,匹配的第二个子串是\2,下面是包含了多个匹配  
  22. echo seven EIGHT | sed 's/\([a-z]\+\) \([A-Z]\+\)/\2 \1'  
  23. # EIGHT seven  

 

awk入门

C代码   收藏代码
  1. awk脚本的基本结构  
  2. awk 'BEGIN{ command } pattern{commands} END{ command }' file  
  3.   
  4. echo | awk '{var1="v1"; var2="v2"; var3="v3"; print var1,var2,var3}'  
  5. #结果v1 v2 v3  
  6. #print var1"-"var2"-"var3  
  7. #结果v1-v2-v3  
  8.   
  9. #特殊变量  
  10. NR  表示记录数量,相当于行号  
  11. NF  表示字段数量,在执行过程中对应当前的字段数  
  12. $0  当前行的文本内容  
  13. $1  第一个字段的文本内容  
  14. $2  第二个字段的文本内容  
  15.   
  16. VAR=1000  
  17. echo | awk -v VARIABLE=$VAR '{print VARIABLE}'  #将外部变量的值传给awk  
  18.   
  19. 用getline读取行  
  20. seq 5 | awk 'BEGIN{ getline; print "read ahead first line", $0} {print $0}'  
  21. #read ahead first line 1  
  22.   
  23. awk 'NR < 5'     #行号小于5的行  
  24. awk 'NR==1,NR==4'   #行号在1到5之间的行  
  25. awk '/linux/'       #包含样式linux的行  
  26. awk '!/linux/'      #不包含样式linux的行     
  27.   
  28. awk -F ":" '{print $NF}' file   #重新设置定界符  
  29. awk 'BEGIN{FS=":"}'     #同上  
  30. "command" | getline output  #将command的输出读入变量output中  
  31. echo | awk '{"grep root /etc/passwd" | getline out; print out}'  
  32. #结果 root:x:0:0:root/root:/bin/bash  
  33.   
  34. #在awk中使用循环  
  35. for(i=0;i<10;i++) {print $i}  
  36. for(i in array) {print array[i]}  
  37. #内建字符串  
  38. length(string)          #返回字符串的长度  
  39. index(string,search_string) #返回search_string在字符串中出现的位置  
  40. split(string,array,delimiter)   #用定界符生成一个字符串列表,并将结果存入数组  
  41. substr(string,star-position,end-position)   #在字符串中用字符起止偏移量生成子串并返回  
  42. sub(regex,replacement_str,string)   #将正则表达式匹配到第一处内容替换成replacement_str  
  43. gsub(regex,replacement_str,string)  #类似上面,但是替换所有处  
  44. match(regex,string)     #检查正则表达式是否能够匹配字符串,能则返回非0,否则返回0  

 

对本文行字符迭代

C代码   收藏代码
  1. while read line  
  2. do  
  3.     echo $line  
  4. done < file.txt  
  5.   
  6. #使用子shell方式  
  7. cat file.txt | (while read line; do echo $line; done)  
  8.   
  9. #迭代一行中每一个单词  
  10. for word in $line  
  11. do  
  12.     echo $word  
  13. done  
  14.   
  15. #迭代一个单词中的每一个字符  
  16. for((i=0;i<$(#word);i++))  
  17. do  
  18.     echo ${word:i:1}  
  19. done  

 

按列合并文件

C代码   收藏代码
  1. paste file1 file2 file3 ...  
  2. paste -d ","        #列之间的定界符  

 

打印不同行或样式之间的文本

C代码   收藏代码
  1. awk 'NR==M, NR==N' filename  
  2. seq 100 | awk 'NR==4, NR==6'    #打印4--6行之间的文本  
  3. awk '/start_pattern/', /end_pattern/ filename  

 

以逆序形式打印

C代码   收藏代码
  1. tac file1 file2 ...  
  2. seq 5 | tac  
  3. seq 9 | awk '{info[NR]=$0; no=NR} END{for(;no>-1;no--){print info[no}}'  

 

解析文本中的电子邮件

C代码   收藏代码
  1. grep -E -o "[A-Za-z0-9]+@[A-Za-z0-9]+\.[a-zA-Z]{2,4}" email.txt  

 

在文件中移除包含某个单词的句子

C代码   收藏代码
  1. sed 's/[^.]*mobile phones[^.]*\.//g' sentence.txt  
  2. #[^.]   可以匹配除.之外的任意字符,每个单词被//替换,注意//之间没有任何字符,也就是空字符  

 

用awk模拟head,tail,tac

C代码   收藏代码
  1. awk 'NR <= 10' filename      #模拟head  
  2. awk '{buffer[N%10]=$0} END{for(i=1;i<11;i++){print buffer[i%10]} }' filename #模拟tail  
  3. awk '{buffer[NR]=$0} END{for(i=NR;i>0;i--){print buffer[i]} }' filename  #模拟tac  

 

文本切片与参数操作

C代码   收藏代码
  1. var="THIS is a line of text"  
  2. echo ${var/line/REPLACE}  
  3. #结果 This is a REPLACE of text  
  4.   
  5. #通过制定字符串的起始位置和长度来生成子串  
  6. ${variable_name:start_pos:length}  
  7. string=abcdefghijklmnopqrstuvwxyz  
  8. echo ${string:4}  
  9. #结果 efghijklmnopqrstuvwxyz  
  10.   
  11. #从第五个字符开始,打印8个字符  
  12. echo ${string:4:8}  
  13. #结果 efghijkl  
  14.   
  15. #从后向前计数,最后一个字符索引记为-1,但必须放到括号内  
  16. echo ${string:(-1)}  
  17. #结果 z  
  18. echo ${string:(-2):2}  
  19. #结果 yz  

 

检测回文字符串

C代码   收藏代码
  1. #类似abbc 这样的字符  
  2. #使用sed的反向引用,p用来打印匹配内容,下面这个命令可以匹配4个字符的回文  
  3. #如abbc, \(.\) 匹配第一个字符,\2是反向引用,\1引用第一个,于是匹配abbc这样的结构  
  4. sed '/^\(.\)\(.\)\2\1/p'  

 

 

 

 

 

第五章 一团乱麻

网站下载

C代码   收藏代码
  1. wget URL1 URL2 URL3  
  2. #下载后的文件名和原始一致进度输出到stdout  
  3. wget ftp://example_domian.com/somefile.img    
  4. wget -t 5 URL       #指定重试次数  
  5. wget URL -o log  
  6. wget --limit-rate 20k URL   #对wget限速  
  7. wget -Q 100m URL        #限制配额,最多只能下载100M  
  8. wget --quote URL        #同上  
  9. wget -C URL         #断点续传  
  10. wget --mirror exampledomain.com     #像爬虫一样递归的收集网页上的所有URL链接  
  11. wget -r -N -l DEPTH URL     # -l 指定页面层级DEPTH,这个选项需要和-r(递归)一同使用  
  12. wget --user username --password pass URL    #认证  
  13.   
  14. #将网页以ASCII字符形式下载到文本文件中  
  15. lynx -dump URL > webpage_text.txt      

 

curl入门

C代码   收藏代码
  1. curl URL        #默认将内容输出到stdout中  
  2. curl URL > index.html  
  3. curl URL --slient   #不显示进度信息  
  4. curl URL -o     #将文结果写入文件,默认和URL中的文件名一致  
  5. curl  URL -o index.html --progress  #在下载过程中显示如 # 的进度条  
  6. curl URL/file -C offset         #能够从特定的文件便宜出继续下载  
  7. curl --referer Referer_URL target_URL   #如果referer是指定中的url,则跳转到那个URL中  
  8. curl URL --cookie "user-slynux;pass=hack"   #指定cookie  
  9. curl URL --cookie-jar cookie_file       #将cookie存入另一个文件  
  10. curl --user-agent "Mozila/5.0"      #指定user-agent头  
  11. curl -H "Accept-language: en"       #指定请求头  
  12. curl URL --limit-rate 20K       #限制curl下载速度  
  13. curl --max-filesize bytes       #指定最大下载量  
  14. curl -u user:pass URL           #进行认证  
  15. curl -I URL             #只返回响应头  
  16. curl -head URL              #同上  
  17. curl -v                 #显示详细内容  

 

 

 

 

 

第六章 B计划

用tar归档

C代码   收藏代码
  1. tar -c      #创建文件  
  2. tar -f      #指定文件名  
  3. tar -v      #详细显示  
  4. tar -t      #查看  
  5. tar -x      #提取归档  
  6. tar -r      #追加归档  
  7. tar -rvf original.tar new_file  
  8. tar -Af file1.tar file2.tar #将file2.tar的内容合并到file1.tar中  
  9. tar -f archive.tar --delete file1 file2 ... #从归档中删除文件  
  10. tar -cf arch.tar.* --exclude "*.txt"        #排除归档  
  11. tar --totals    #打印归档后的总字节数  
  12. tar -u      #只有比归档文件中的同名文件更新的时候才进行添加  
  13. #如  tar -uvf archive.tar filea  只有filea的文件内容修改时间更新的时候才对他添加  
  14. tar -d      #打印出两者之间的差别  
  15. tar -j      #指定bunzip2格式  
  16. tar -z      #指定gzip格式  
  17. tar --lzma  #指定lzma格式  

 

用cpio归档 

C代码   收藏代码
  1. #用于将多个文件和文件夹存储为单个文件,同时还能保利麓所有的文件属性  
  2. touch file1 file2 file3  
  3. echo file1 file2 file3 | epio -ov > archive.cpio #归档  
  4. cpio -it < archive.cpio      #列出归档  
  5. cpio -id < archive.cpio      #从归档中提取文件  
 

gzip压缩

C代码   收藏代码
  1. gzip filename       #会创建filename.gz的文件,并将原文件filename删除  
  2. gzip -l filename    #列出压缩文件的属性信息  
  3. cat file | gzip -c > file    #从stdin中读取并写入到stdout中  
  4. gzip --fast     #最低压缩比  
  5. gzip --best     #最高压缩比  
  6. gunzip filename.gz  #解压缩  
  7. tar -zcvf archive.tar.gz [FILES]    #创建gzip归档  
  8. tar -cvf archive.tar [FILES]    #先创建归档  
  9. gzip archive.tar        #再压缩  
  10. tar -ztvf archive.tar.gz    #查看  
  11. tar -zxvf archive.tar.gz    #提取  
  12. gzip -9 test.img        # 1级最低,9级最高压缩率  
  13. zcat test.gz        #直接查看压缩文件  
 

bzip压缩

C代码   收藏代码
  1. bzip2 filename      #会创建filename.bz2文件,并删除原始的filename文件  
  2. cat file | gzip2 -c file.tar.bz2    #从stdin中读取并写入到stdout中  
  3. tar -jcvf archive.tar.bz2 [FILES]   #创建归档  
  4. tar -cvf archive.tar [FILES]        #先创建归档  
  5. bzip2 archive.tar           #再压缩  
  6. tar -jtvf archive.tar.bz2       #查看  
  7. tar -jxvf archive.tar.bz2       #提取  
  8. bzip2 -9 test.img       #和gzip一样从1--9级,1最快9压缩率最高  
 

zip归档

C代码   收藏代码
  1. zip archive_name.zip [SOURCE FILES/DIRS]  
  2. #如 zip file.zip file  
  3. #对目录和文件进行递归操作,和bzip2 gzip不同,zip不会删除原始文件  
  4. zip -r archive.zip folder1 file2      
  5. unzip file.zip      #解压缩,不会删除原始文件  
  6. zip file.zip -u newfile #更新归档中的内容  
  7. zip -d arc.zip file.txt #从压缩归档中删除内容  
  8. zip -l archive.zip  #列出归档文件中的内容  
 

加密工具与散列

C代码   收藏代码
  1. crypt  output_file  
  2. Enter passphrass:           #将stdin中接收一个文件以及口令,输出到output  
  3. crpyt PASSPHRASE < input_file > encrypted_file    #通过命令行参数来提供口令  
  4. crpyt PASSHRASE -d < encrypted_file > output_file #创建解密文件  
  5.   
  6. gpg -c filename     #加密文件  
  7. gpg filename.gpg    #解密文件  
  8.   
  9. base64 filename > outputfile #将文件编码为base64格式  
  10. cat file | base64 > outputfile  
  11. base64 -d file > outputfile  #解码base64文件  
  12. cat base64_file | base64 -d outputfile  
  13. md5sum file #输出编码和文件名  
  14. sha1sun file    #输出编码和文件名  
  15. openssl passwd -1 -salt SALT_STRING PASSWORD    #利用openssl加盐散列加密  

 

用rsync备份系统快照

C代码   收藏代码
  1. rsync -av source_path destination_path      #将源目录复制到目的端  
  2. rsync -a        #比较进行归档  
  3. rsync -v        #打印详细信息  
  4. rsync -av username@host:PATH destination    #将远程机主机上的数据恢复到本地主机  
  5. rsync -z            #传输时压缩数据  
  6. rsync --exclude "*.txt"     #指定需要排除的文件  
  7. rsync --exclude-from FILEPATH   #通过一个列表文件指定需要排除的文件  
  8. rsync -avz SOURCE DESTINATION --delete      #备份时删除已不存在的文件  

 

用dd克隆磁盘

C代码   收藏代码
  1. dd if=SOURCE of=TARGET bs=BLOCK_SIZE count=COUNT  
  2. dd if=/dev/sda1 of=sda1_partition.img       #将一个分区复制到文件中  
  3. dd if=sda1_partition.img of=/dev/sda1       #用备份恢复分区  
  4. dd if=/dev/zero of=/dev/sda1            #永久性删除一个分区中所有数据  
  5. dd if=/dev/sda of=/dev/sdb          #在容量相同的硬盘间进行克隆  
  6. dd if=/dev/cdrom of=cdrom.iso           #制作CD ROM的镜像  

 

其他

C代码   收藏代码
  1. lzma  
  2. 超高压缩率的squashfs文件系统  

 

 

 

 

 

第七章 无网不利

联网知识

C代码   收藏代码
  1. #打印可用的网络接口列表   
  2. ifconfig | cut -c-10 | tr -d ' ' | tr -s '\n'   
  3. #打印eth1网卡的ip   
  4. ifconfig eth1 | grep "inet" | cut -d ":" -f 2 | awk '{print $1}'   
  5. #MAC地址欺骗   
  6. ifconfig eth1 hw enter [新的MAC地址]   
  7.   
  8. HWaddr 这个是MAC地址   
  9. inet addr   IP地址   
  10. Bcast    广播地址   
  11. Mask     子网掩码   
  12.   
  13.   
  14. 分配给当前系统的名字服务器可以通过/etc/resolv.conf查看   
  15. host www.baidu.com  #列出这个域名的所有IP   
  16. nslookup 域名  #类似host,会列出更多细节   
  17. route    #显示路由表   
  18. route -n #指定以数字形式显示地址   
  19. traceroute 域名    #以显示分组途径的所有网关地址,用于测量源和目的经过了多少跳   
  20. ping -c 数量 域名   #发送多少ICMP包   
  21.   
  22. #探测子网内所有活跃的机器,将循环体内放到 ( ) 内,可以并行执行脚本,也就是生成多个子shell,最后wait是等待   
  23. #上面的子shell执行技术   
  24. for ip in 192.168.0.1.{1..255}   
  25. do   
  26. (   
  27. ping $ip -c 2 &> /dev/null   
  28. if [ $? -eq 0 ];then   
  29. echo $ip is alive   
  30. fi   
  31. ) &   
  32. wait   
  33. done   
  34.   
  35. #fping可以ping一组ip   
  36. fping -a #指定打印出所有活动主机的IP   
  37. fping -u    #打印出所有无法达到的主机   
  38. fping -g    #指定从写作IP/mask的 "斜线--子网掩码" 记法或者起止IP地址记法中生成IP地址范围   
  39. fping -a 192.168.1/24 -g   
  40. fping -d    #对每一个echo回应进行DNS查询来返回主机名   
  41. fpipng -a -d 2> /dev/null < ip.list   
  42. cat ip.list   
  43. 192.168.0.86   
  44. 192.168.0.9   
  45. 192.168.0.6   
  46. #结果   
  47. www.local   
  48. dnss.local   

 

传输

C代码   收藏代码
  1. scp SOURCE DESTIONATION   
  2. scp user@remotehost:/home/path/filename source_filename   
  3. #递归复制   
  4. scp -r /home/slynux user@remotehost:/home/backups   
  5. scp -p   #在复制文件的同时保留文件的权限和模式   

 

SSH

C代码   收藏代码
  1. ssh-keygen -t rsa   
  2. 默认放到~/.ssh目录中   
  3. id_rsa.pub 是生成的公钥   
  4. id_rsa 是生成的私钥   
  5. 公钥必须添加到远程服务器的 ~/.ssh/authorized_keys   
  6.   
  7. #添加一个密钥,会提示要输入密码,之后就不用输入密码了   
  8. ssh USER@REMOTE_HOST "cat >> ~/.ssh/authorized_keys" < ~/.ssh/id_rsa.pub   
  9. ssh -C user@hostname COMMANDS    #传输时压缩数据   

 

网络监控

C代码   收藏代码
  1. lsof -i  #检测所有打开的端口   
  2. netatat -antp   

 

 

 

 

 

第八章 当个好管家

统计磁盘使用情况

C代码   收藏代码
  1. du FILENAME1 FILENAM2 ...  
  2. du -a DIRECTORY  #递归的统计目录下所有的文件大小  
  3. du -h    #以KB,MB,GB的方式打印大小  
  4. du -c    #统计所有文件和目录综合,最后会统计总大小  
  5. du -c *.txt  
  6. du -b FILE(s)    #打印字节  
  7. du -k FILE(s)    #打印KB为单位的文件  
  8. du -m FILE(s)    #打印MB为单位的文件  
  9. du -B BLOCK_SIZE FILE   #打印以指定块为单位的文件大小  
  10. du - B 4 pcpu.sh  
  11. du --exclude "*.txt" FILE(s)     #排除指定的文件  
  12. du --exclude-from EXCLUDE.txt DIRECTORY  #EXCLUDE.txt包含了需要排除的文件列表  
  13. du --max-depth 2 DIRECTORY   #指定最大递归深度  
  14. du -s DIRECTORY  #累计指定目录总大小  
  15.   
  16. #找出指定目录中最大的10个文件  
  17. du -ak DIRECTORY | sort -nrk 1 | head  
  18. find . -type f -exec du -k {} \; | sort -nrk 1 | head  
  19.   
  20. df #打印磁盘目录  
  21. df -h   #按照MB,GB的格式打印  

 

计算时间

C代码   收藏代码
  1. time COMMAND  
  2. real    从开始到结束的时间  
  3. user    进程再用户模式下花费的时间  
  4. sys 在内核模式下花费的时间  

 

与当前登陆用户启动日志及启动故障的相关信息

C代码   收藏代码
  1. who  #获取当前登陆的相关信息  
  2. w    #同who,但是更详细  
  3. users    #当前登陆的用户列表  
  4. uptime   #系统运行了多少时间以及平均负载  
  5. last     #登陆会话信息,实际上是一个系统登陆日志,包括了tty,登陆时间状态灯信息  
  6. last -f /var/log/wtmp   #明确指定日志文件  
  7. last USER    #获取单个用户登陆会话信息  
  8. lastb    #获取失败的用户登陆会话信息  

 

打印历史记录中最常用的10条命令

C代码   收藏代码
  1. printf "COMMAND\tCOUNT\n"; history | awk '{list[$4]++} END{ for(i in list){printf("%s\t%d\n",i,list[i])} }' | sort -nrk 2 |  
  2. head  

 

列出一小时内占用CPU最多的10个进程

C代码   收藏代码
  1. LOOP=3600  
  2. for((i=0;i
  3. do  
  4.     ps -eo comm,pcpu | tail -n +2 >> /tmp/cpu_usage.$$  
  5.     sleep 1  
  6. done  
  7.   
  8. cat /tmp/cpu_usage.$$ | awk '{process[$1]+=[$2]} END{ for(i in process){printf("%-20s %  
  9.   
  10. s",i,process[i);} }' | \  
  11. sort -nrk 2 | head  

 

一些监控命令

C代码   收藏代码
  1. watch #在某段时间间隔内不断监视某个命令的输出  
  2. watch ls    #监控ls  
  3. watch 'ls -l | grep xx'  #监控ls和grep  
  4. watch -d ls  #高亮显示变化  
  5.   
  6. inotifywait #用来收集有关文件访问的信息  

 

用logrotate管理日志文件

C代码   收藏代码
  1. 配置目录位于/etcc/logrotate.d  
  2. 可以为自己的日志文件编写一个特定的配置  
  3. cat /etc/logrotate.d/program  
  4. /var/log/program.log {  
  5.     missingok  
  6.     notifempty  
  7.     size 30k  
  8.         compress  
  9.     weekly  
  10.         rotate 5  
  11.     create 0600 root root  
  12. }  
  13. 其中/var/log/program.log 指定了日志文件路径,旧的日志文件归档之后也放入同一个目录中  
  14. 配置参数  
  15. missingok   如果日志文件丢失则忽略,然后返回(不对日志文件行轮替)  
  16. notifempty  仅当源日志文件非空时才对其进行轮替  
  17. size 30k    限制实施轮替的日志文件大小,可以用1M表示1MB  
  18. compress    允许用gzip对较旧的日志进行压缩  
  19. weekly      指定进行轮替的时间间隔,可以是weekly,yearly,daily  
  20. rotate 5    这是需要保留的旧日志文件的归档数据。在这里是5  
  21.                 所以这些文件名将会是program.log1.gz,program.log.2.gz直到program.log.5.gz  
  22. create 0600 root root   指定所要创建的归档文件的模式,用户以及用户组  

 

用syslog记录日志

C代码   收藏代码
  1. /var/log是存储日志文件的公共目录,这里的文件是被称为syslog的协议处理的  
  2. 由守护进程sylogd负责执行  
  3. linux中的一些重要日志文件  
  4. /var/log/boot.log       系统启动信息  
  5. /var/log/httpd          apache web服务器日志  
  6. /var/log/message        发布内核启动信息  
  7. /var/log/auth.log       用户认证日志  
  8. /var/log/dmesg          系统启动洗洗  
  9. /var/log/mail.log       邮件服务器日志  
  10. /var/log/Xorg.0.log     X服务器日志  
  11.   
  12. logger LOG_MESSAGE  
  13. logger this is a test log line  
  14. tail -n 1 /var/log/message  #查看刚刚输出的日志,如果是用logger命令,他默认记录到  
  15.                 #这个文件中  
  16. logger TAG this is a message    #通过TAG将日志记录到不同的文件中  

 

 

 

 

 

第九章 管理重任

收集进程信息

C代码   收藏代码
  1. ps -f   显示更多的列  
  2. ps -e   系统的每一个进程  
  3. ps -ax  也类似ps -ef  
  4. ps -o   指定输出的列,如ps -o comm  
  5.         ps -eo comm,pcpu | head  
  6. -o 适用的参数如下  
  7. pcpu    cpu占用率  
  8. pid 进程ID  
  9. ppid    父进程ID  
  10. pmem    内存使用率  
  11. comm    可执行文件名  
  12. cmd 简单明了(simple command)  
  13. user    启动进程的用户  
  14. nice    优先级(niceness)  
  15. time    累计的CPU时间  
  16. etime   进程启动后度过的时间  
  17. tty 所关联的TTY设备  
  18. euid    有效用户ID  
  19. stat    进程状态  
  20.   
  21. --sort对特定参数进行排序,+ 表示升序,- 表示降序  
  22. ps -eo comm,pcpu --sort -pcpu | head  
  23. ps -C [command_name] #如 ps -C bash  
  24. ps -C bash -o pid=      #跟上pid= 就可以移除头部,只显示单个pid  
  25.    #类似pidof  
  26. ps -u   有效用户  
  27. ps -U 真实用户  
  28. #如 ps -u root -U root -o user,pcpu  
  29. ps -t TTY1, TTY2 ...  
  30. #如 ps -t pst/0, pst/1  
  31.   
  32. ps -eLf     #NLWP是进程的线程数量,NLP是ps输出中每个条目的线程ID  
  33. ps -eLF --sort -nlwp | head  
  34. ps -e w     # w表示宽松输出  
  35. ps -eo pid,cmd e | tail -n 3    # e表示显示进程依赖的环境变量  

 

杀死进程以及发送或响应信号

C代码   收藏代码
  1. kill -l #列出所有可用信号  
  2. kill PROCESS_ID_LIST    #终止一个进程  
  3. kill -s SIGNAL PID  #参数SIGNAL要么是信号名称,要么是信号数  
  4. 具体如下:  
  5. SIGHUP  1   对控制进程或终端进行挂起检测  
  6. SIGINT  2   当按下ctrl+c时发送该信号  
  7. SIGKILL 9   用于强行杀死进程  
  8. SIGTERM 15  默认用于终止进程  
  9. SIGTSTP 20  当按下ctrl+z时发送该信号  
  10. #强行杀死进程  
  11. kill -s SIGKILL PROCESS_ID  
  12. kill -9 PROCESS_ID  
  13.   
  14. killall process_name  
  15. killall -s SIGNAL process_name  
  16.   
  17. killall -9 process_name  #强行杀死  
  18. killall -u USERNAME process_name    #通过名称以及所属用户名指定进程  
  19. pkill process_name   #pkill和kill类似,但是pkill接受的是进程名  
  20.   
  21. #trap命令在脚本中用来为信号分配处理程序  
  22. trap 'echo `date`:can not terminate by ctrl+C' 2  
  23. #将对一个进程执行kill或者对某个进程执行ctrl+c 时候,会出现上面的提示  
  24. #说明已经捕捉了此信号  

 

which,whereis,file,whatis与平均负载

C代码   收藏代码
  1. #which命令用来找出某个命令的位置。我们在终端输入命令的时候无需知道对应的可执行文件位于  
  2. #何处。终端会在一组位置中查找这个命令,这一组位置由环境变量PATH指定  
  3. #如 which is  
  4.   
  5. #where和which命令类似,但是它不仅返回命令的路径,还能够打印出其对应的命令手册的位置以及命令源代码的路径  
  6. whereis ls  
  7.   
  8. #file 命令用来确定文件的类型  
  9. file /bin/ls  
  10.   
  11. #whatis命令会输出作为参数的命令的简短描述信息,这些信息是从命令手册中解析得来的  
  12. whatis ls  
  13.   
  14. #平均负载,显示了1分钟,5分钟,15分钟的平均负载情况,以及系统的开机时间  
  15. uptime  

 

向用户终端发送消息

C代码   收藏代码
  1. wall  
  2. mesg  

 

收集系统信息

C代码   收藏代码
  1. hostname     #打印当前系统的主机名  
  2. uname -n     #打印当前系统的主机名  
  3. uname -a     #打印linux内核版本,硬件架构等详细信息  
  4. uname -r     #打印内核发行版本  
  5. uname -m     #打印主机类型  
  6. cat /proc/cpuinfo   #打印出CPU的相关信息  
  7. cat /proc/cpuinfo | head -n 5 | tail -1  #获得处理器名称  
  8. cat /proc/meminfo   #打印内存的详细信息  
  9. cat /proc/partitions    #打印分区的详细信息  
  10. fdisk -l     #同上  
  11. lshw     #同上  

 

用/proc收集信息

C代码   收藏代码
  1. 系统中每一个运行的进程在/proc中都有一个对应的目录  
  2. environ  包含与进程相关联的环境变量  
  3. cwd  是一个到进程工作目录的符号链接  
  4. fd   包含了由进程所使用的文件描述符  

 

用cron进行调度

C代码   收藏代码
  1. cron表每一个条目都由6部分组成,按照下列顺序排列  
  2. 分钟 0--59  
  3. 小时      0--23  
  4. 天       1--31  
  5. 月份      1--12  
  6. 工作日 0--6  
  7. 命令  在指定时间执行的脚本或命令  
  8. * 表示指定命令在每一个时间段都执行  
  9.   
  10. 02 * * * *  /home/slynux/test.sh    #在每天的每个小时的第2分钟执行  
  11. 00 5,6,7 * *  /home/slynux/test.sh  #要在每天的第5,6,7小时执行脚本  
  12. 00 */12 * * 0  /home/slynux/script.sh   #在周日的每个小时执行脚本  
  13. 00 02 * * *    /sbin/shutdown -h    #在每天凌晨2点关闭计算机  
  14. crontab -e #手动编辑cron脚本  
  15. crontab -l   #列出cron表中的内容  
  16. crontab -l -u slynux    #指定用户名来查看其cron表  
  17. crontab -r 移除当前cron表中的内容  

 

 用户管理脚本

C代码   收藏代码
  1. useradd [用户名]       #增加用户  
  2. deluser [用户名]       #删除用户  
  3. chsh USER -s SHELL      #修改用户默认的shell  
  4. usermode -L USER        #锁定用户  
  5. usermode -U USER        #解锁用户  
  6. chage -E DATE           #处理用户账户的过期信息  
  7.     其他选项  
  8.     -m MIN_DAYS         #将更改密码的最小天数修改成MIN_DAYS  
  9.     -M MAX_DAYS         #设置密码有效的最大天数  
  10.     -W WARN_DAYS        #设置在前几天提醒需要更改密码  
  11. passwd USER         #更改用户密码  
  12. addgroup GROUP          #增加一个新用户组  
  13. delgroup GROUP          #删除一个用户组  
  14. figer USER          #显示用户信息  

 

 

 

 

 

参考:

linux shell关联数组

你可能感兴趣的:(计算机书籍)