shell 学习笔记

一、文件安全与权限

1、文件有读r 写w 可执行x 三个权限 对应数字 4 2 1

使用ls -l 出来的最前面的就是文件的权限位

-rwxr-x-r-- 最前面-表示普通文件,剩下的三位三位读,分别表示文件的权限,文件所在组用户的权限,其他用户权限

drwxr-xr-- 最前面d表示目录。

2、改变权限,chmod [who] operator [permission] filename

who 指的是 哪个用户,u :指的是当前文件属主,g :同组用户 ,o :其他组用户 a : 所有用户

operator 指的是 + 增加权限; - 取消权限 ; = 设定权限

permission 指的是赋予什么样的权限,有 r  w  x  ,此外还有s : 文件属主和组set-ID ;t 粘性位* ; l : 给文件加锁,使其他用户无法访问;

如果本来是 r--r--r-- 想加可执行权限,则可以 chmod u + x  file 或者chmod 544 file

3、umask值 :用户设定创建文件或者文件夹时候的初始权限; 对于文件来说,系统不允许在创建文件时候就有可执行权限,所以一个文件的权限是666(6=4+2+0)

而文件夹是777(7=4+2+1); 如果umask值为022,那么创建的新的文件 权限应该是644; 文件夹的权限则是755 (记住:umask是从文件中拿走位的,比如022就是拿走 0,拿走2 ,拿走2 )

4、符号链接 ln [-s] source_path  target_path (路径可以是目录也可以是文件) ,多个文件可以指向一个源文件,想改变只要改一个源文件,而不必每个客户端用户文件都改动一遍

二、find和xagrs

1、find命令

find pathname -options [-print -exec -ok] pathname表示所要查找的目录 .表示当前目录。/表示系统根目录

-print 命令将结果打印出来 。 -exec 和 -ok都是用来对匹配的文件执行该参数所给出的shell命令 (-ok每次要确认,更加安全),相应的命令形式为:'command' {} \

例: find . -type f -exec ls -al {} \;

2、-options 就是要操作的动作  例:find . -name "[A-Z]*" -print    在当前目录下找到  名字为A到Z开头的 所有文件(-name是按照文件名查找)

3、-perm 按照文件权限找 find . -perm -755 -print

4、忽略某个目录 比如在/apps下找文件 但是忽略/apps/bin下面的内容 find /apps -name "/apps/bin" -prune -o -print

5、查找比某个文件新或旧的文件 find . -newer newfile ! -newer oldfile

查找比某个文件新的  find . -newer file -print (延伸:查找两个小时前到现在的文件,新建一个文件file1  9月6号14点(touch -t09061400 file1),时间改成两小时前,用此命令查即可)

6、使用xargs命令 :使用-exec命令每处理一个匹配到的文件都会启一个相应的进程,而使用xargs 则只启动一个进程

find . -type f -print |xargs file

三、crontab

1、可以通过cron.deny 和cron.allow 来禁止和允许用户拥有自己的crontab

命令格式:分<>时<>日<>月<>星期<>要运行的命令

第一列分:1-59 第二列小时:1-23 (0为子夜) 第三列日:1-31 第四列月:1-12 第五列星期:0-6 (0表示周日) 第六列:要运行的命令

例:30 21 * * * /apps/bin/cleanup.sh 表示每天晚上21.30 执行cleanup.sh脚本

0 23 * * 6,0 /apps/bin/cleanup.sh 表示每周六周日的23点 执行cleanup.sh脚本

0 23 1-4 * * /apps/bin/cleanup.sh 表示每个月的1-4号的23点 执行cleanup.sh脚本

crontab 每隔5分钟同步时间到服务器211.138.22.34 */5

*/5 * * * *  /usr/sbin/ntpdate 211.138.22.34 >> /data/ntpdate.log

crontab -e 编辑 -l 列出内容不编辑 -u 用户名 -r 删除 如果用当前用户登录crontab 则不需要-u命令

crontab -l -u alddms (显示alddms 用户下的ctontab 内容)

四、文件名置换(用户查找匹配文件名)

1、* 用于匹配文件名中任意字符串,包括空。

ls app* 列出app开头的所有文件 ls *.txt 列出以.txt为后缀的所有文件

2、? 用于匹配文件名中任何单个字符串

ls a?p* 列出ap中间有任意一个字符,p后面为任意字符的所有文件 如axpxx

3、[...] 用于匹配[]中包含的任意字符

ls log.[0-9] 列出以log.开头,后面是一个数字的 所有文件  如 log.3

4、[!...]用于匹配[]中!后的任意字符

ls log.[!0-9]* 列出以log.开头,.后面非数字开头的所有文件 如log.axxx

五、输入输出

1、echo read cat 管道(|) tee cat test.log |tee -a t1.log 把test.log中内容显示在桌面并且输入到t1.log中(-a表示追加输入)

六、命令执行顺序

1、命令执行控制

&& : 命令1 && 命令2 只有命令1成功后命令2才执行

|| : 命令1 || 命令2 只有命令1失败了才执行命令2

2、命令组合

() : (命令1;命令2;命令3;...) 当前命令在同一个shell中执行

{} : {命令1;命令2;命令3;...} 当前命令被放到一个子shell中执行

七、正则表达式(RE)

1、匹配行首和行尾

^ : 匹配行首

$ : 匹配行尾

匹配空行 ^$

匹配一个字符的 ^.$

* :一个单字符后紧跟*,匹配0个或者多个此单字符 如 123.txt中有 12345 12358  123 12223 12456

使用命令 cat 123.txt|grep '1234*' 结果为12345 12358 123

[] : 匹配[]中字符,可以是单个字符,也可以是字符序列,可以使用-表示序列范围,如[1-5]替代[12345]

匹配任意字母数字 [a-zA-Z0-9]

[^a-zA-Z] 匹配任意非字母型字符

[^0-9] 匹配任意非数字型字符

\ : 用来屏蔽一个元字符的特殊含义

. : 匹配任意单字符

pattern\{n\} : 用来匹配前面pattern 出现的次数n

A\{2\}B 结果为AAB

pattern\{n,m\} : 用来匹配前面pattern出现的次数, 次数在n和m之间

A\{2,4\}B 结果为AAB,AAAB,AAAAB

pattern\{n,\}m : 用来匹配前面pattern出现的次数,次数最少为n

A\{2,\}B 结果为AAB,AAAB,AAA...AB,...

2、特殊经常用到的匹配

IP地址格式 nnn.nnn.nnn.nnn [0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\} 解释:[0-9]\{3\} 就是pattern\{n\} 表示由三位数0-9组成

日期格式 dd-mm-yyyy [0-9]\{2\}-[0-9]\{2\}-[0-9]\{4\}

匹配任意字符 [^.*$]

3、fork炸弹的概念:进程递归式派生(fork,亦即自我复制),以使系统拒绝服务甚至崩溃

:(){ :|:& };:

注释如下:

:() # 定义函数,函数名为":",即每当输入":"时就会自动调用{}内代码

{ # ":"函数开始标识

: # 用递归方式调用":"函数本身

| # 并用管道(pipe)将其输出引至...

: # 另一次递归调用的":"函数

# 综上,":|:"表示的即是每次调用函数":"的时候就会生成两份拷贝

& # 调用间脱钩,以使最初的":"函数被杀死后为其所调用的两个":"函数还能继续执行

} # ":"函数结束标识

; # ":"函数定义结束后将要进行的操作...

: # 调用":"函数,"引爆"fork炸弹

其中函数名“:”只是简化的一例,实际实现时可以随意设定,一个较易理解(将函数名替换为“forkbomb”)的版本如下:

forkbomb(){ forkbomb|forkbomb &} ; forkbomb

八、grep和正则表达式

1、grep 用法: grep [选项] 基本正则表达式[文件]

-c 只输出匹配行的计数

-i 不区分大小写

-h 查询多文件时不显示文件名

-l 查询多文件时只输出包含匹配字符的文件名

-n 显示匹配行及行号

-s 不显示不存在或无匹配的错误信息

-v 显示不包含匹配文本的所有行

2、 查询多个文件

如果在所有的doc文件中查询sort,则应该这么写:grep "sort" *.doc

匹配行:在test.txt中查询包含48的有多少行

grep -c "48" test.txt 该结果只显示多少行

显示查询的结果: grep -c "48" test.txt

显示满足所有匹配结果的行号及内容

grep -n "48" test.txt   显示样式 23:48xx .....

显示非匹配行 grep -v "48"  test.txt

精确匹配 grep "48\v"  test.txt

行首不是48 grep '^[^48]' test.txt

第九章、AWK

1、三种方式调用awk 第一:awk [-F 域分隔符] 'command' inputfile 这里的command是真正的awk命令,[]里是可选的,不填默认是空格分隔

例如以:分隔 awk -F: 'command' inputfile

第二:将所有awk命令写到一个文件中,并使awk命令可行,然后用awk命令解释器作为脚本的首行,通过键入脚本名来执行

第三:将所有awk命令插入一个文件,然后调用: awk -f awk-script-file inputfile

2、域和记录:浏览域标记为$1,$2,$3,$4,$5 这种发发称为域标识 $0表示全部域 awk '{print $0}' test.txt |tee log.txt

awk '{print $1,$4}' test.txt

awk 'BEGIN {print "Begin \n"} {print $1} END {"end!"}'

3、NF 打印最后一列 ll | awk '{print $NF}' 打印第一列 ll | awk '{print $1}'

不打印最后一列 ll | awk 'NF--'    不打印第一列  ll |awk '{$1="";print $0}'

4、NR 用于快速查域记录个数 awk '{if (NR >0 && $4~/Brown/) print $0}' grade.txt 如果域记录大于0,且第四列匹配Brown,就打印那一行的信息

5、利用awk打印第一行: ll | awk 'NR==1' 打印最后一行:ll | awk 'END{print}' 不打印第一行和最后一行 awk 'NR>2{print p}{p=$0}' test.txt

6、

第十章、SED

1、打印第N行 sed -n '2p' test.txt 打印test.txt中的第二行 最后一行 sed -n '$p' test.txt

2、打印3-5行 sed -n '3,5p' test.txt

3、匹配god这个词并打印该行 sed -n '/god/'p test.txt

4、在第四行匹配god,有该词就打印 sed -n '4,/god/'p test.txt

5、匹配元字符$ sed -n '/\$/'p test.txt

6、打印1到最后一行 sed -n '1,$p' test.txt

7、将abc替换成def sed  's/abc/def/g' test.txt 替换并修改test.txt文本 则 sed -i 's/abc/def/g' test.txt

8、删除最后一行、删除1-3行 sed '$d' test.txt sed '1,3d' test.txt

windows上写的脚本到shell上面会有莫名其妙的问题,按照如下操作

  vi xxxx.sh 

    输入:

set ff    可以查看文件是dos还是unix 如果是dos 就执行下面的

:set ff=unix(或者:set fileformat=unix) 

    :wq 

或者dos2unix file -- 不一定都有dos2unix 命令

你可能感兴趣的:(shell 学习笔记)