美文网首页
shell 学习笔记

shell 学习笔记

作者: 风也醉 | 来源:发表于2019-06-06 10:28 被阅读0次

    一、文件安全与权限

    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 学习笔记

          本文链接:https://www.haomeiwen.com/subject/gqsyxctx.html