linux shell脚本攻略

xiaoxiao2021-02-28  49

第一章 小试牛刀

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

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

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

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

    printf 

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

输出带色彩的文件和背景

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

 

变量的一些简单实用

C代码   var=hello  输出var变量  echo $var  echo ${var}     求字符串长度  echo ${#var}     当前的shell版本  echo $SHELL  echo $0  

 

数学运算

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

 

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

C代码   result=`expr 3+4`  result=$(exprt $no1+5)  

 

 

输入输出

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

 

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

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

 

数组

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

 

关联数组

C代码   declare -A ass_array  ass_array=(([index1]=val-1 [index2]=val-2))  或者:  ass_array[index1]=val-1  ass_array[index2]=val-2  fruits_value=( [apple]='100 dollars' [orage]='150 dollars' )      列出数组索引  echo $(!array_var[*])  echo $(!array_var[@])     语法               描述   ${!array[*]}    取关联数组所有键   ${!array[@]}    取关联数组所有键   ${array[*]}     取关联数组所有值   ${array[@]}     取关联数组所有值   ${#array[*]}    关联数组的长度   ${#array[@]}    关联数组的长度       

 

别名

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

 

时间

C代码   sleep 秒  usleep 微妙(百万分之一秒)  date,格式化字符串  星期    %a(简写) %A(完整)  月      %b(简写) %B(完整)  日      %d  年      %y(两位表示)  %Y(四位表示)  小时    %H  分钟    %M  秒      %S  纳秒    %N  时间戳  %s  

 

调试

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

 

函数

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

 

从控制台读取

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

 

分隔符

C代码   读取/etc/passwd,打印出用户默认的shell  line="root:x:0:0:root:/root:/bin/bash"  oldIFS=$IFS  IFS=":"  count=0  for item in $line;  do      [ $count -eq 0 ] && user=$item;      [ $count -eq 6 ] && shell=$item;      let count++  done;  IFS=$oldIFS  echo $user\'s shell is $shell  结果: root's shell is /bin/bash  echo {1..50}          #能够生产从1到50的数字列表  echo {a..z}或者{A..Z},或者使用{a..h}生产部分列表  for i in {a..z} do action; done;        for循环  for var in list;  do      command;  done        采用c语言中的for循环格式  for((i=0;i<10;i++)) {      commands;  }        while循环  while condition  do      command;  done  true作为循环条件能够参数无限循环        until循环(它会一直执行循环直到给定的条件为真)  x=0;  unitl [ $x -eq 9 ];   do      let x++;      echo $x;  done  

 

比较

C代码   if condition;then      commands;  fi    if condtion;then      commands;  elif condtion;then      commands;  else      commands;  fi  条件通常被放置在封闭的中括号内,一定要注意在[或]与操作数之间有一个空格,如果忘记空格脚本就    会报错            一些重要的操作符:  -gt    大于  -lt    小于  -ge    大于或等于  -le    小于或等于  -eq    等于  -nq    不等于            文件系统相关测试  [ -f $file_var ]    如果给定的变量包含正常的文件路径或文件名则返回真  [ -x $var ]         如果给定的变量包含的文件可执行,则返回真  [ -d $var ]         如果给定的变量包含的是目录,则返回真  [ -e $var ]         如果给定的变量包含的文件存在,则返回真  [ -c $var ]         如果给定的变量包含的是一个字符设备文件的路径,则返回真  [ -b $var ]         如果给定的变量包含的是一个块设备文件的路径,则返回真  [ -w $var ]         如果给定的变量包含的文件可写,则返回真  [ -r $var ]         如果给定的变量包含的文件可读,则返回真  [ -L $var ]         如果给定的变量包含的是一个符号链接,则返回真        字符串比较(因为有时候采用单个中括号会产生错误,最好使用双个中括号)  注意在 = 前后各有一个空格,如果忘记加空格,那就不是比较关系了,而变成赋值语句了   [[ $str1 = $str2 ]   [[ $str1 == $str2 ]  [[ $str1 != $str2 ]  [[ $str1 > $str2 ]        #str1的字母序比str2大  [[ $str1 < $str2 ]   [[ -z $str1 ]]            #如果str1包含的是空字符串,则返回真  [[ -n $str1 ]]            #如果str1包含的是空字符串,则返回真  

 

 

 

 

 

第二章 命令之乐

 cat相关

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

 

录制和回放终端会话

C代码   script  scriptreplay  

 

 文件查找

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

 

玩转xargs

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

 

 用tr进行转换

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

 

校验和核实

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

 

排序

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

 

单一与重复

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

 

临时文件与随机数

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

 

文件分割

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

 

根据扩展名切分文件名

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

  

批量重命名和移动

C代码   count=1;  for img in *.jpg *.png  do      new=image-$count.${img##*.}      mv "$img" "$new" 2> /dev/null        if [ $? -eq 0 ];then          echo "renaming $img to $new"          let count++      fi  done  

 

 

 

 

 

第三章 以文件之名

生成任意大小的文件

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

 

文件的交集与差集

C代码   cat a.log  apple  gold  iron  orange  silver  steel    cat b.txt  carrot  cookies  gold  orange    comm a.log b.log  结果:  apple          carrot          cookies                  gold  iron                  orange  silver  steel    第一列是只在a.log中出现的  第二列是只在b.log中出现的  第三列是同时在a.log和b.log中出现的  comm a.log b.log -1      #删除第一列  comm a.log b.log -2  #删除第一列  comm a.log b.log -3  #删除第一列  comm a.log b.log -1 -2   #删除第一和第二列  

 

查找并删除重复文件

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

 

文件权限 所有者和粘滞位

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

 

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

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

 

查找符号链接及指向

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

 

 

列举文件类型统计信息 

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

 

环回文件与挂载

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

 

文件补丁

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

 

 

head和tail

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

 

只列出目录

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

  

 

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

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

 

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

C代码   wc -l file    #统计行数  wc -w file    #统计单词数  wc -c file    #统计字符数  wc file       #打印出文件的行数,单词数和字符数  wc file -L    #打印最长行的长度  

 

打印目录树

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

 

 

 

 

 

第四章 让文本飞

正则表达式

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

 

用grep搜索

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

 

用cut按列切分文件

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

 

统计特定文件中的词频

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

 

sed入门

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

 

awk入门

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

 

对本文行字符迭代

C代码   while read line  do      echo $line  done < file.txt    #使用子shell方式  cat file.txt | (while read line; do echo $line; done)    #迭代一行中每一个单词  for word in $line  do      echo $word  done    #迭代一个单词中的每一个字符  for((i=0;i<$(#word);i++))  do      echo ${word:i:1}  done  

 

按列合并文件

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

 

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

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

 

以逆序形式打印

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

 

解析文本中的电子邮件

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

 

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

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

 

用awk模拟head,tail,tac

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

 

文本切片与参数操作

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

 

检测回文字符串

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

 

 

 

 

 

第五章 一团乱麻

网站下载

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

 

curl入门

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

 

 

 

 

 

第六章 B计划

用tar归档

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

 

用cpio归档 

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

gzip压缩

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

bzip压缩

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

zip归档

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

加密工具与散列

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

 

用rsync备份系统快照

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

 

用dd克隆磁盘

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

 

其他

C代码   lzma  超高压缩率的squashfs文件系统  

 

 

 

 

 

第七章 无网不利

联网知识

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

 

传输

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

 

SSH

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

 

网络监控

C代码   lsof -i  #检测所有打开的端口   netatat -antp   

 

 

 

 

 

第八章 当个好管家

统计磁盘使用情况

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

 

计算时间

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

 

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

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

 

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

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

 

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

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

 

一些监控命令

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

 

用logrotate管理日志文件

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

 

用syslog记录日志

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

 

 

 

 

 

第九章 管理重任

收集进程信息

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

 

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

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

 

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

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

 

向用户终端发送消息

C代码   wall  mesg  

 

收集系统信息

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

 

用/proc收集信息

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

 

用cron进行调度

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

 

 用户管理脚本

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

 

 

 

 

 

参考:

linux shell关联数组

转载请注明原文地址: https://www.6miu.com/read-2614313.html

最新回复(0)