zoukankan      html  css  js  c++  java
  • Shell脚本

    Shell简介

    Shell是用户与操作系统之间的桥梁,通过Shell用户尅对Linux操作系统及其内核进行控制

    交互式Shell不能满足日常需要,为了把工作和任务通过自动化方式完成,所以应运而生Shell脚本

    所以Shell脚本就是把多个Shell命令按照一定的逻辑写入一个文件,这个文件则为Shell脚本

    Shell分为多种,常用sh与bash

    查看系统安装了哪些Shell:

    cat /etc/shells

    查看当前使用的Shell

    echo $SHELL

    切换Shell环境,如果之前安装了zsh

    chsh -s /bin/zsh

    环境变量

    env与export相同,显示当前用户环境变量,不显示自定义变量

    declare与set相同,显示用户环境变量和自定义变量

    Find

    .:表示当前目录

    -name:根据名称查找

    find . -name “*.txt”

    -user:  根据用户查找

    -group:根据用户组查找

    -perm: 根据权限查找

    -size:  根据文件大小查找 +N 表示大于N的文件 -N表示小于N的文件 N表示等于N的文件

          N的单位: c, k, M, G  其中c是字节

    -regex: 根据正则表达式匹配查找

    -type 查找某一类型的文件,诸如:
    b - 块设备文件。
    d - 目录。
    c - 字符设备文件。
    p - 管道文件。
    l - 符号链接文件。
    f - 普通文件

    Shell中的文本处理

    最简单的就是echo,以下三种都会输出Hello World

    echo 'Hello World'
    echo "Hello World"
    echo Hello World

    带变量的echo

    str="Hello World"
    echo "$str, Hi"

    echo中的换行符

    普通的 会被直接输出的,下面就会输出 Hello World

    echo "Hello
    World"

    我们只需要使用 -e,即可换行

    echo -e "Hello
    World"

    grep命令

    grep三兄弟:grep  fgrep  egrep   fgrep=grep -F   egrep=grep -E

    其中grep和egrep支持正则表达式,grep支持基本正则,egrep包含扩展正则

    那么fgrep还活着干嘛,怎么不去死呢?

    因为如果我们想匹配正则的符号,比如"^This",那就需要fgrep了,还是做了一点微小的工作:D

    最基本的文本搜索

    grep juntaran /etc/passwd

    -c 选项只输出包含关键字的行数 

    -n 选项不仅输出该行内容,也输出行号

    -A [num] After的缩写 num输出关键字所在行以及后面num行

    -B [num] Before的缩写 num输出关键字所在行以及前面num行

    -C [num] 包含了-A与-B

    -v 反向搜索 除了这行别的都输出

    -i 忽略大小写

    多文件搜索


    -l 搜索包含该关键字的所有文件

    juntaran@ALW-VM:~/workspace/shell/testDic$ vim test1.txt
    juntaran@ALW-VM:~/workspace/shell/testDic$ vim test2.txt
    juntaran@ALW-VM:~/workspace/shell/testDic$ vim test3.txt
    juntaran@ALW-VM:~/workspace/shell/testDic$ grep -l -i "this" *.txt

    -L 反向搜索,不包含该关键字的所有文件

    '^[word]' 以[word]开头的所有文件

    juntaran@ALW-VM:~/workspace/shell/testDic$ grep '^This' *

    '[word]$' 以[word]结尾的所有文件

    juntaran@ALW-VM:~/workspace/shell/testDic$ grep 'second$' *

    精准匹配词

    因为文本包含This is ***

    只想匹配“is”这个词,而如果单纯的搜索会把This也搜索到

    juntaran@ALW-VM:~/workspace/shell/testDic$ grep '<is>' *.txt

    可以看到is标了红而This没有

    grep -rn "NotApplicable" ./ --color

    sed命令

    sed=stream editor,顾名思义“流编辑器”
    sed [command] [file]

    值得注意的是sed命令不直接修改原文件,如果想修改需要加 -i

    command分为了两部分,一部分是范围设定,一部分是动作处理

    范围设定:指定行数:'3,5' 第3 4 5行

              '5,$' 第5行到最后一行

         模式匹配:/^[^dD]/ 表示匹配行首是否是d或D开头

    动作处理:d:删除该行

         p:打印该行

         r:读取指定文件的内容

         w:写入指定文件

         a:在下面插入新行新内容

    删除包含2的行(sed的删除只是在模式空间内执行,不会修改原文件)

    sed '/2/d' test.txt

    -n 输出匹配行

    juntaran@ALW-VM:~/workspace/shell/testDic$ sed -n '/6/p' test.txt
    19246

    简单应用

    juntaran@ALW-VM:~/workspace/shell/testDic$ sed -n '1,2p' test.txt
    19248
    19247
    juntaran@ALW-VM:~/workspace/shell/testDic$ sed -n '2,$p' test.txt
    19247
    19246

    替换字符(依然不会修改原文件)

    '/AA/s/BB/CC/g' 匹配带有AA的行,把所有的BB替换为CC

    juntaran@ALW-VM:~/workspace/shell/testDic$ sed '/^[tT]/s/h/H/g' test2.txt
    THis is second

    删除每行前两个字符 

    juntaran@ALW-VM:~/workspace/shell/testDic$ sed 's/..//' test2.txt
    is is second

    Linux大棚里面两个脚本题目

    1. 写脚本实现,可以用shell、perl等。在目录/tmp下找到100个以abc开头的文件,然后把这些文件的第一行保存到文件new中。

    #!/bin/sh
    for filename in `find /tmp -type f -name "abc*"|head -n 100`
    do
    sed -n '1p' $filename>>new
    done

    2. 写脚本实现,可以用shell、perl等。把文件b中有的,但是文件a中没有的所有行,保存为文件c,并统计c的行数。

    #!/usr/bin/perl -w
    open B,"c" or die "c error.($!)";
    my $find=0;
    my ($myb,$mya);
    while(){
        $find=0;
        chomp($myb=$_);
        print "B ",$myb,"
    ";
        open A,"){
            chomp($mya=$_);
            print "A ",$mya,"
    ";
            if($mya=~/$myb/){
                $find=1;
                print "FIND!
    ";
            }
        }
        if($find==0){
            print C $myb,"
    ";
        }
    }
    close A;
    close B;
    close C;
    $linenum=`cat c|wc -l`;
    print "c line count:",$linenum;

    grep一句话:

    grep -v -x a.txt -f b.txt | wc -l

    ip.txt,统计出现次数最多的前3个ip极其次数

    sort ip.txt | uniq -c | sort -rn | head -n 3

    行列操作

    删除第一行

    sed -i '1d' filename

    删除最后一列

    awk '{print $NF}'  filename

    取出某一列

    awk '{print $N}' filename

    参考自Linux大棚blog  找运维一定要看!

    http://roclinux.cn/

  • 相关阅读:
    Linux合并iso
    Oracle中使用escape关键字实现like匹配特殊字符,以及&字符的转义
    hash算法-time33算法
    理解JMS规范中消息的传输模式和消息持久化
    Oracle启动
    Weblogic缓存
    shell
    Hibernate 延迟载入
    Android获取cpu使用率,剩余内存和硬盘容量
    TestNG的组測试和组中组測试
  • 原文地址:https://www.cnblogs.com/Juntaran/p/5789651.html
Copyright © 2011-2022 走看看