shell 编程笔记

这段时间学习shell整理的笔记

第1章 文件安全与权限
 显示文件
    ls -l

d   目录。
l   符号链接(指向另一个文件
s   套接字文件。
b   块设备文件。
c   字符设备文件。
p   命名管道文件。

  创建一个文件:
     touch myfile

  更改文件权限:
     chmod [who] operator [permission] filenam
      who: u g o a
      operator:+ - =
      operator: r(4) w(2) x(1)

     chown -R owner file
     chgrp groupname file

     id 自己信息
     umask 002
     ln [-s] source_path target_path
       ln -s /usr/opt/monitor/regstar/reg.log /var/adm/logs/monitor.log

   $ H O M E中查找文件名符合* . t x t的文件
       $ find ~ -name "*.txt" -print
   $ H O M E中查找文件名以一个大写字母开头的文件
       $ find . -name "[A-Z]*" -print
   /etc目录中查找文件名以host开头的文件
       $ find /etc -name "host*" -print
   查找文件权限位为 7 5 5的文件
       $ find . -perm 755 -print
   在/apps目录下查找文件,但不希望在/ a p p s / b i n目录下查找
       $ find /apps -name "/apps/bin" -prune -o -print
   在 $ H O M E目录中查找文件属主为d a v e的文件
       $ find ~ -user dave -print
   在/apps目录下查找属于a c c t s用户组的文件
       $ find /apps -group accts -print
   查找没有有效所属用户组的所有文件
       $ fine/-nogroup-print
   查找属主帐户已经被删除的文件(在/ e t c / p a s s w d文件中没有有效帐户的文件)
       $ find /home -nouser -print
   查找更改时间在5日以内的文件
       $ find / -mtime -5 -print
   在/var/ a d m目录下查找更改时间在3日以前的文件
       $ find /var/adm -mtime +3 -print
   假设现在的时间是2 3 : 4 0,希望查找更改时间在两个小时以内的文件
       $ touch -t 03111750 file
       $ ls -l file
       $ find . -newer file -print
   为了在/ e t c目录下查找所有的符号链接文件
       $ find /etc -type l -print
   为了在当前目录下查找除目录以外的所有类型的文件
       $ find . ! -type d -print
   查找文件长度大于1 M字节的文件
       $ find . -size +1000000c -print
   查找文件长度恰好为1 0 0字节的文件
       $ find /home/apache -size 100c -print
   查找长度超过1 0块的文件(一块等于5 1 2字节)
       $ find . -size +10 -print
   在当前的文件系统中查找文件(不进入其他文件系统)
       $ find . -name "*.XC" -mount -print
   首先匹配所有的文件然后再进入子目录中查找
       $ find / -name "CON.FILE" -depth -print

  crontab 举例:  *(分钟) *(小时) *(每月的几日) *(月) *(每周星期几)

第1列 分钟1~5 9
第2列 小时1~2 3(0表示子夜)
第3列 日1~3 1
第4列 月1~1 2
第5列 星期0~6(0表示星期天)
第6列 要运行的命令

-u   用户名。
-e   编辑c r o n t a b文件。
-l   列出c r o n t a b文件中的内容。
-r   删除c r o n t a b文件。

     表示每晚的2 1 : 3 0运行/ a p p s / b i n目录下的c l e a n u p . s h
        30 21* * * /apps/bin/cleanup.sh
     每月1、1 0、2 2日的4 : 4 5运行/ a p p s / b i n目录下的b a c k u p . s h
        45 4 1,10,22 * * /apps/bin/backup.sh
     在每天1 8 : 0 0至2 3 : 0 0之间每隔3 0分钟运行/ a p p s / b i n目录下的d b c h e c k . sh
        0,30 18-23 * * * /apps/bin/dbcheck.sh
     表示每星期六的11 : 0 0 p m运行/ a p p s / b i n目录下的q t r e n d . s h
        0 23 * * 6 /apps/bin/qtrend.sh

     linux系统重起cron服务的方法为:/sbin/service crond  restart
     aix系统重起cron服务的方法为:kill -9 pid(cron服务),cron服务后自动重起。

 创建一个新的crontab文件:
     在 $ H O M E目录下的. p r o f i l e文件
        加入  EDITOR=vi; export EDITOR
        vi davecron                    建一个新的crontab文件    
 $ crontab davecron             提交crontab

 如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用n o h u p命令
      nohup command &

 echo string

 定义变量:
    read name
      输入hello
    echo $name
 
输入文件—标准输入 0
输出文件—标准输出 1
错误输出文件—标准错误 2

command > filename 把把标准输出重定向到一个新文件中
command > filename 2>&1 把把标准输出和标准错误一起重定向到一个文件中
command 2 > filename 把把标准错误重定向到一个文件中
command >> filename 2>&1 把把标准输出和标准错误一起重定向到一个文件中 (追加)

&&左边的命令(命令1)返回真(即返回0,成功被执行后,&&右边的命令(命令2)才能够被执行
   mv who.ini awho.ini && echo "it's success

sort file.txt 对文件排序

正则表达式介绍:


^ 只只匹配行首
$ 只只匹配行尾
* 只一个单字符后紧跟*,匹配0个或多个此单字符
[ ] 只匹配[ ]内字符。可以是一个单字符,也可以是字符序列。可以使用 -
表示[ ]内字符序列范围,如用[ 1 - 5 ]代替[ 1 2 3 4 5 ]
\ 只用来屏蔽一个元字符的特殊含义。因为有时在 s h e l l中一些元字符有
特殊含义。\可以使其失去应有意义
. 只匹配任意单字符
pattern \ { n \ } 只用来匹配前面pattern出现次数。n为次数
pattern \ { n,\ } m 只含义同上,但次数最少为n
pattern \ { n,m \ } 只含义同上,但pattern出现次数在n与m之间

 匹配以单词t r o u b l e结尾的所有行
    t r o u b l e $
 要匹配所有空行
    ^ $   
    ^ . $
 使用\屏蔽一个特殊字符的含义
 下列字符可以认为是特殊字符
     $ . ' " * [ ] ^ | () \ + ?

 注意^符号的使用,当直接用在第一个括号里,意指否定或不匹配括号里内容
    [ ^ 0 - 9 ]   匹配任一非数字型字符

 匹配字母A出现两次,并以B结尾
    A \ { 2 \ } B
 匹配A至少4次  
    A \ { 4 , \ } B
 A出现2次到4次之间
    A \ { 2 , 4 \ } B

 grep 查匹配的字符

-c   只输出匹配行的计数。
-i   不区分大小写(只适用于单字符)。
-h   查询多文件时不显示文件名。
-l   查询多文件时只输出包含匹配字符的文件名。
-n   显示匹配行及行号。
-s   不显示不存在或无匹配文本的错误信息。
-v   显示不包含匹配文本的所有行。

 所有. d o c文件中查找字符串“s o r t”
     $ grep "sort" *.doc
 精确匹配
     $ grep "sort" *.doc
 抽取包含S e p t的所有月份,不管其大小写,并且此行包含字符串 4 8 3
     $ grep "[Ss]ept' data.f | grep 483
 对一个字符串使用grep
     str="hello every one"
     echo $str | grep "one"

 测试是否已设置或初始化变量。如果未设置或初始化,就可以使用另一值:
     $ { v a r i a b l e : - v a l u e }

$ cu='chen'
$ echo "the ask is ${cu:-hi} today" (如果未设置或初始化,就可以使用hi)

readonly 变量  变量设置为只读

设置环境变量:
   VARIABLE-NAME = v a l u e
   Export VARIABLE-NAME
pg 分页显示
   变量 ARIABLE-NAME ='chen' 输出'chen'
   变量 ARIABLE-NAME ="chen" 输出 chen

打印当前系统上用户数目:
   echo "ther are 'who | wc -l' users on the system "


test测试:
- d 目录             - s 文件长度大于0、非空
- f 正规文件         - w 可写
- L 符号连接         - u 文件有s u i d位设置
- r 可读             - x 可执行

test -r tt.txt
echo $?   (正确显示0,错误显示1)


确定当前的运行级别:
 $ who -r
 $ runlevel
查看doc_part文件是否被打开,有哪些进程在使用:
 $ fuser -m /root/doc_part
该命令可以显示当前所使用的登录用户名
  $ logname
可以使用tty来报告所连接的设备或终端
  $tty
记录当前会话
  $script. 文件名
  exit
意味着系统在10秒钟之内不进行任何操作
  $sleep 10 
可以看二进制文件中所包含的文本
  $strings 文件名
whereis命令能够给出系统命令的二进制文件及其在线手册的路径
  $whereis  命令
tr用法(字符转换)
  # tr -s "[a-z]" < a.txt >b.txt   a.txt的字符有重复的小写转为b.txt文件
  # cat da|tr -s "[a-z]"

  # tr -s "[\012]" < a.txt  去掉空行
  # tr -s "[\n]" < a.txt
  # tr -s "[\015\032]" "[\012*]"  < input_file  一般的dos到unix转换命令
  # echo "may May"|tr "[a-z]" "[A-Z]"    小写转大小
  # cat a.txt|tr "[a-z]" "[A-Z]" >b.txt
  # cat a.txt|tr "[A-Z]" "[a-z]" > b.txt 大小转小写
  # tr -cs "[a-z][A-Z]" "[\012*]" < a.txt  只保留大小字母,并分行

  sort分类:
  # sort a.txt > b.txt
  # uniq a.txt > b.txt 消除重复的行(只在行连续重复时才有效)
    # uniq -u a.txt   只显示不重复行
    # uniq -d a.txt   只显示有重复数据行
  join(将来自两个分类文本文件的行连在一起)
  # join a.txt b.txt
  # join -a1 a.txt b.txt      当有不匹配时,只显示a.txt
  # join -a1 -a2 a.txt b.txt  当有不匹配时,都显示出来
  split用来将大文件分割成小文件(将文件按每个最多1000行分割)
  # split 文件
  # split -100 文件  指定每个文件100行分割
  paste按行将不同文件行信息放在一行
  # ls | paste -d ""  以一列格式显示输出
  # paste a.txt b.txt
  cut用来从标准输入或文本文件中剪切列或
  # cut -c 1-3 c.txt          显示每行从开头算起1到3的字母
  # cut -c 1-2,5-10 c.txt     显示从1到2,还有5到10的字母
  # cut -f 1,3 c.txt          显示1和3栏的字符(使用tab分隔)
  sed用法:文本编辑器(强大的文本过滤工具)
  删除:d命令
     $ sed '2d' example-----删除example文件的第二行。
     $ sed '2,$d' example-----删除example文件的第二行到末尾所有行。
     $ sed '$d' example-----删除example文件的最后一行。
     $ sed '/test/'d example-----删除example文件所有包含test的行。
  替换:s命令
     $ sed 's/test/mytest/g' example-----在整行范围内把test替换为mytest。如果没有g标记,则只有每行第一个匹配的test被替换成mytest
     $ sed 's/^192.168.0.1/&localhost/' example-----&符号表示替换换字符串中被找到的部份。所有以192.168.0.1开头的行都会被替换成它自已加 localhost,变成192.168.0.1localhost
 写入文件:w命令
     $ sed -n '/test/w file' example  在example中所有包含test的行都被写入file里
     # sed '/^kai/a\\  this is a example' b.txt   " this is a example"被插入到以kai开头后面的新一行
     # sed '/^kai/i\\  this is a example' b.txt   " this is a example"被插入到以kai开头后面的前一行

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/658698/viewspace-254570/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/658698/viewspace-254570/

你可能感兴趣的:(shell 编程笔记)