一、文件安全与权限
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 命令