Linux与unix Shell编程指南 总结

分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

               

Unix命令行程序和内建指令(更多)

文件系统
 cat  cd  chmod  chown
 chgrp  cksum  cmp  cp
 du  df  fsck  fuser
 ln  ls  lsattr  lsof
 mkdir  mount  mv  pwd
 rm  rmdir  split  touch
 umask      
 
程序
 at  bg  chroot  cron
 exit  fg  jobs  kill
 killall  nice  pgrep  pidof
 pkill  ps  pstree  sleep
 time  top  wait  
 
使用环境
 env  finger  id  logname
 mesg  passwd  su  sudo
 uptime  w  wall  who
 whoami  write    
 
文字编辑
 awk  comm  cut  ed
 ex  fmt  head  iconv
 join  less  more  paste
 sed  sort  strings  talk
 tac  tail  tr  uniq
 vi  wc  xargs  
 
Shell 程序
 alias  basename  dirname  echo
 expr  false  printf  test
 true  unset    
 
网络
 inetd  netstat  ping  rlogin
 netcat  traceroute    
 
搜索
 find  grep  locate  whereis
 which      
 
杂项
 apropos  banner  bc  cal
 clear  date  dd  file
 help  info  size  lp
 man  history  tee  tput
 type  yes  uname  whatis



1. 文件权限

$ls   -l- rw-r--r-- 1   dave    admin    300   Fed 19 22:05  myfile

文件类型     文件权限   文件属主   文件属主dave 的用户组   文件字节长度    文件更新时间      文件名
 -                    rw-r--r-- 1    dave                admin                    300                  Fed 19 22:05        myfile

 1 .文件类型
文件权限位前面的那个字符,我们例子中的横杠就是文件的类型,即普通文件类型。
文件类型有七种,它可以从 ls -l命令所列出的结果的第一位看出:
d   目录。l  符号链接(指向另一个文件)。s  套接字文件。b  块设备文件。c  字符设备文件。p  命名管道文件。
-    普通文件,或者更准确地说,不属于以上几种类型的文件。

2.文件的权限:

文件的权限可分为三类:
1) 文件属主,创建该文件的用户。如 -rw:文件属主权限 这是前面三位
2) 同组用户,拥有该文件的用户组中的任何用户。如 -r-: 同组用户权限 这是中间三位
3) 其他用户,即不属于拥有该文件的用户组的某一用户。如 -r-:其他用户权限 这是最后三位

3.修改权限: chmod

1)符合模式:chmod [who]  operator [permission]  filename

who的含义是:u文件属主权限。g同组用户权限。o其他用户权限。a所有用户(文件属主、同组用户及其他用户)。
operator的含义:+ 增加权限。-取消权限。= 设定权限。
permission的含义:r读权限。w写权限。执行权限。s 文件属主和组set -ID。t 粘性位*。给文件加锁,使其他用户无法访问。

u,g,o   针对文件属主、同组用户及其他用户的操作。

chmod u+x myfile  //赋予文件属主执行权限
2) 绝对模式:  chmod  [mode]   file
其中mode是一个八进制数:
0400 文件属主可读        0040 同组用户可读          0004 其他用户可读
0200 文件属主可写        0020 同组用户可写          0002 其他用户可写
0100 文件属主可执行    0010 同组用户可执行       0001 其他用户可执行
myfile文件具有这样的权限:
  rw-         r--         r--
  4+2        4         4

把相应权限位所对应的值加在一起,就是644。

4.chown和chgrp

chown命令的一般形式为:
chown -R -h owner file
- R选项意味着对所有子目录下的文件也都进行同样的操作。

 - h选项意味着在改变符号链接文件的属主时不影响该链接所指向的目标文件。

如:

$ chown mysql hiscore 把 hiscore文件的属主改为mysql
$ chown -R mysql hiscore 递归地把hiscore(数据库名称)目录下的所有文件属主改成mysql

chgrp命令和chown命令的格式差不多

chgrp sybadmin project

把project文件所属的组由admin变为sybadmin(系统中的另外一个用户组) 。

2. ls、find和xargs

ls使用技巧

以找到当前目录中最大的那个文件:

ls -lSrh


“r”的作用是将大的文件列在后面,而“h”则是给出易于人们阅读的输出(MB或者诸如此类)。你也可以搜寻最大的MP3/MPEG文件:

ls -lSrh *.mp*

你也可以通过下面这条命令搜寻最大的目录:

du -kx | egrep -v "\./.+/" | sort -n



Find命令的一般形式为:

find pathname -options [-print -exec -ok]
让我们来看看该命令的参数:
    pathname   find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。
   -options      为命令选项
   -print           find命令将匹配的文件输出到标准输出。
   -exec         find命令对匹配的文件执行该参数所给出的 shell命令。相应命令的形式为 ' comm -and' {} \;,注意{ }和\;之间的空格。
   -ok   和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的 shell命令,
在执行每一个命令之前,都会给出提示,让用户来确定是否执行。

1.  find命令选项

   -name   按照文件名查找文件。
   -perm   按照文件权限来查找文件。
   -prune   使用这一选项可以使find命令不在当前指定的目录中查找,                                                                                                                                  如果同时使用了-depth选项,那么-prune选项将被find命令忽略。
   -user   按照文件属主来查找文件。
   -group   按照文件所属的组来查找文件。
   -mtime   -n +n   按照文件的更改时间来查找文件,
                - n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前。 
                find命令还有- atime和-ctime选项,但它们都和-mtime选项相似,所以我们在这里只介绍- mtime选项。
   -nogroup   查找无有效所属组的文件,即该文件所属的组在 /etc/groups中不存在。
   -nouser   查找无有效属主的文件,即该文件的属主在 /etc/passwd中不存在。
   -newer file1 ! file2   查找更改时间比文件file1新但比文件file2旧的文件。
   -type   查找某一类型的文件,诸如:
   b - 块设备文件。
   d - 目录。
   c - 字符设备文件。
   p - 管道文件。
   l - 符号链接文件。
   f - 普通文件。
  -size n[c]   查找文件长度为n块的文件,带有c时表示文件长度以字节计。
  -depth   在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
  -fstype   查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件/etcfstab中找到,该配置文件中包含了本系统中有关文件系统的信息。
   -mount   在查找文件时不跨越文件系统mount点。
   -follow   如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。
   -cpio   对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。

2. find的例子:

1)匹配$ H O M E目录下的所有文件,下面两种方法都可以使用:
$ find $HOME -print
$ find ~ -print

2) 在当前目录中查找suid置位,文件属主具有读、写、执行权限,并且文件所属组的用户和其他用户具有读和执行的权限的文件,可以用:
$ find . -type f -perm 4755 -print
3 )查找系统中所有文件长度为0的普通文件,并列出它们的完整路径,可以用:

        $ find / -type f -size 0 -exec ls -l {} \;

可以按照文件长度来查找文件,这里所指的文件长度既可以用块(block)来计量,也可以用字节来计量。以字节计量文件长度的表达形式为N c;以块计量文件长度只用数字表示即可。  

在按照文件长度查找文件时,一般使用这种以字节表示的文件长度,在查看文件系统的大小,因为这时使用块来计量更容易转换。  

实例1:在当前目录下查找文件长度大于1 M字节的文件  

命令:

find . -size +1000000c -print

实例2:在/home/apache目录下查找文件长度恰好为100字节的文件:  

命令:

find /home/apache -size 100c -print  

实例3:在当前目录下查找长度超过10块的文件(一块等于512字节) 

命令:

find . -size +10 -print



4) 查找/var/logs目录中更改时间在7日以前的普通文件,并删除它们,可以用:
$ find /var/logs -type f -mtime +7 -exec rm {} \;
5) 查找系统中所有属于audit组的文件,可以用:
$find /-name -group audit -print
6) 我们的一个审计系统每天创建一个审计日志文件。日志文件名的最后含有数字,这样我们一眼就可以看出哪个文件是最新的,哪个是最旧的。 admin.log文件编上了序号:
admin.log.001、admin.log.002等等。下面的find命令将删除/logs目录中访问时间在7日以前、含有数字后缀的admin.log文件。该命令只检查三位数字,所以相应日志文件的后缀不要超过999。
$ find /logs -name 'admin.log[0-9][0-9][0-9] '-atime +7 -exec rm {} \;
7) 查找当前文件系统中的所有目录并排序,可以用:
$ find . -type d -print -local -mount |sort
8) 查找系统中所有的rmt磁带设备,可以用:
$ find /dev/rmt -print

9)从根目录开始查找所有扩展名为.log的文本文件,并找出包含”ERROR”的行:

$ find / -type f -name "*.log" | xargs grep "ERROR" 


10、使用find在多个文件中替换掉相同的文本

要替换当前目录以及下层目录里所有文件中的Windows为Linux,你可以这样运行:

find . -name '*.txt' -print | xargs perl -pi -e's/Windows/Linux/ig' *.txt


或者如果你更需要让它只作用于普通文件上

find -type f -name '*.txt' -print0 | xargs --null perl -pi -e 's/Windows/Linux/'




3. 后台执行命令

1. crontab

1). crontab的域

是crontab的格式:
分  时  日  月  星期 要运行的命令
第1列 分钟1~59
第2列 小时1~23(0表示子夜)
第3列 日1~31
第4列 月1~12
第5列 星期0~6(0表示星期天)
第6列 要运行的命令
crontab文件的一个条目是从左边读起的,第一列是分,最后一列是要运行的命令,它位于星期的后面。
用横杠-来表示一个时间范围,例如你希望星期一至星期五运行某个作业,那么可以在星期域使用1-5来表示。
使用逗号“,” ,例如你希望星期一和星期四运行某个作业,只需要使用 1,4来表示。
用星号 *来表示连续的时间段。如果你对某个表示时间的域没有特别的限定,也应该在该域填入 *。
该文件的每一个条目必须含有 5个时间域,而且每个域之间要用空格分隔。该文件中所有的注释行要在行首用#来表示。

例子:

分 时 日 月 星期 要运行的命令
30 21 *   *  *   /apps/bin/cleanup.sh :表示每晚的21:30运行/apps/bin目录下的cleanup.sh。
45 4  1,10,22 * * /apps/bin/backup.sh :表示每月1、10、22日的4:45运行/apps/b i n目录下的backup.sh。
10 1 * * 6,0 /bin/find -name "core" -exec rm {} \; :表示每周六、周日的1 : 1 0运行一个f i n d命令。
0,30 18-23 * * * /apps/bin/dbcheck.sh:表示在每天18:00至23:00之间每隔30分钟运行/apps/bin目录下的dbcheck.sh。
0 23 * * 6 /apps/bin/qtrend.sh :表示每星期六的11:00pm运行/apps/bin目录下的qtrend.sh。

每隔30分钟时运行:

*/30 * *   *  *   /apps/bin/cleanup.sh :

2) 创建和提交crontab文件:
创建一个名为davecron。的文件,加入如下的内容:
#15 minutes between 6pm and 6am
0,15,30,45 18-06 * * *  /bin/echo `date` > /dev/console
系统将每隔 15分钟向控制台输出一次当前时间。
如果系统崩溃或挂起,从最后所显示的时间就可以一眼看出系统是什么时间停止工作的。
提交crontab文件,cron命令的参数:
$ crontab davecron
现在该文件已经提交给cron进程,它将每隔1 5分钟运行一次。
同时,新创建文件的一个副本已经被放在/var/spool/cron目录中,文件名就是用户名davecron。

2) 常用参数:

crontab   -l   //查看当前用户下的cron任务
crontab -e  //编辑当前用户的定时任务
crontab -u  linuxso  -e  //编辑用户linuxso的定时任务
crontab -r   //删除crontab文件
注意:编辑crontab文件,最好先选择好编辑器,选vim(3):

update-alternatives --config editor

There are 3 choices for the alternative editor (providing /usr/bin/editor).  Selection    Path               Priority   Status------------------------------------------------------------  0            /bin/nano           40        auto mode  1            /bin/ed            -100       manual mode  2            /bin/nano           40        manual mode  3            /usr/bin/vim.tiny   10        manual mode

3) $HOME目录中对crontab文件做一备份:
$crontab -l > $HOME/mycron
4) 恢复丢失的crontab文件:
如果不小心误删了crontab文件,假设你在自己的$HOME目录下还有一个备份,那么可以将其拷贝到/var/spool/cron/,其中是用户名。如果由于权限问题无法完
成拷贝,可以用:
$ crontab
其中,是你在$HOME目录中副本的文件名。
我建议你在自己的$HOME目录中保存一个该文件的副本。我就有过类似的经历,有数次误删了crontab 文件(因为r键紧挨在e键的右边…) 。这就是为什么有些系统文档建议不要直接
编辑crontab 文件,而是编辑该文件的一个副本,然后重新提交新的文件。
有些crontab 的变体有些怪异,所以在使用crontab 命令时要格外小心。如果遗漏了任何选
项,crontab 可能会打开一个空文件,或者看起来像是个空文件。这时敲crontab 键退出,不要按
< Ctrl - D >,否则你将丢失crontab 文件。

查看crontab服务状态:service crond status

手动启动crontab服务:service crond start

2. at命令提交命令或者shell脚本

1)at命令使用
at命令允许用户向cron守护进程提交作业,使其在稍后的时间运行。这里稍后的时间可能是指10min以后,也可能是指几天以后。如果你希望在一个月或更长的时间以后运行,最好还是使用crontab文件。一旦一个作业被提交, at命令将会保留所有当前的环境变量,包括路径,不象crontab,只提供缺省的环境。该作业的所有输出都将以电子邮件的形式发送给用户,除非你对其输出进行了重定向,绝大多数情况下是重定向到某个文件中。和crontab一样,根用户可以通过/etc目录下的at.allow和at.deny文件来控制哪些用户可以使用at命令,哪些用户不行。不过一般来说,对at命令的使用不如对crontab的使用限制那么严格。
at命令的基本形式为:
at [-f script] [-m -l -r] [time] [date]
其中,
-f script 是所要提交的脚本或命令。
-l 列出当前所有等待运行的作业。at q命令具有相同的作用。
-r 清除作业。为了清除某个作业,还要提供相应的作业标识(ID);有些UNIX变体只接受atrm作为清除命令。
-m 作业完成后给用户发邮件。
time at命令的时间格式非常灵活:
1) 可以是H、HH.HH MM、HH : MM或H:M,其中H和M分别是小时和分钟。还可以使用a.m.或p.m.。
2)date日期格式可以是月份数或日期数,而且at命令还能够识别诸如today、tomorrow这样的词。现在就让我们来看看如何提交作业。

2)使用at命令提交命令或脚本
使用at命令提交作业有几种不同的形式,可以通过命令行方式,也可以使用at命令提示符。
一般来说在提交若干行的系统命令时,我使用at命令提示符方式,而在提交s h e l l脚本时,使用命令行方式。
如果你想提交若干行的命令,可以在at命令后面跟上日期/时间并回车。然后就进入了at命令提示符,这时只需逐条输入相应的命令,然后按‘ ’退出。下面给出一个例子:
root@ubuntu:/home/hadoop/testsh# at 16:10
warning: commands will be executed using /bin/sh
at> find /etc -name "passwd" -print
at>
at> job 1 at 2012-10-22 16:10     
其中, 
就是。在16:10  系统将执行一个简单的find命令。
你应当已经注意到,我所提交的作业被分配了一个唯一标识job 1。该命令在完成以后会将全部结果以邮件的形式发送给我。
如果希望向at命令提交一个shell脚本,使用其命令行方式即可。在提交脚本时使用- f选项。
$ at 3.00pm tomorrow -f /apps/bin/db_table.sh
warning: commands will be executed using /bin/sh
job 8 at 2012-10-23 15:00
在上面的例子中,一个叫做db_table.sh的脚本将在明天下午3:00运行。
还可以使用echo命令向at命令提交作业:

$ echo find /etc -name "passwd" -print | at now +1 minute

4. shell输入与输出

1 . echo 
字符串被重定向到一个名为myfile文件中:
$ echo "The log files have all been done"> myfile
2 . read 
可以使用read 语句从键盘或文件的某一行文本中读入信息,并将其赋给一个变量。如果只
指定了一个变量,那么read 将会把所有的输入赋给该变量,直至遇到第一个文件结束符或回
车。
它的一般形式为:

你可能感兴趣的:(Linux与unix Shell编程指南 总结)