zoukankan      html  css  js  c++  java
  • linux shell编程进阶学习(转)

    第一节:基础

    ls -lh  ——可以用户友好的方式看到文件大小

    file 文件名 ——查看文件类型

    stat 文件名 ——查看文件当前状态

    man 命令/函数名 ——查看详细的帮助文档

    man中看某一命令选项的定位技巧  —— 输入/ -n -n前面要有一定的空格

    #!/bin/bash

    echo “Hello World!”

    chmod 777 hello.sh或chmod a+x hello.sh等

    ./hello.sh执行

    echo -e选项用来增强,支持转义字符。

    var=world

    echo “hello $var  ” ——输出hello world 

    echo -e “hello $var  ” ——输出hello world后有换行 

    echo -e "33[32;40mHELLO YOU 33[0m" 

    ——输出不同颜色的字体,以33[开头,

    ——33[0m结尾,3x是前景色,4x是背景色 

    第二节:变量

    set/declare ——查看环境变量

    env ——查看环境变量 

    两者是有区别的,set/declare显示所有的本地变量,env是获取环境变量

    unset 变量名 ——取消变量

    shell中所有变量都是字符串,变量区分大小写,如foo和Foo是不同的变量;

    变量必须以字母或下划线开头;

    变量名和值之间没有空格:MSG=Hello √  MSG=  Hello×

    只读变量用readonly: readonly MSG=12   MSG=13×

    变量引用:echo $var / echo ${var} 后者更加严格

    修改环境变量:PATH=$PATH:/bin/opt

    永久修改环境变量:vim ~/.bashrc;export PATH=${PATH}:/bin/opt ;source .bashrc

    补充:

    /etc/profile:

    此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.
    并从/etc/profile.d目录的配置文件中搜集shell的设置.

    /etc/bashrc:

    为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.

    ~/.bash_profile:

    每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该
    文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件. 

    ~/.bashrc:

    该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该
    该文件被读取.

    ~/.bash_logout:

    当每次退出系统(退出bash shell)时,执行该文件. 
    另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承/etc/profile中的变量,他们是"父子"关系. 

    注意他们之间有执行的优先级; 

    第三节:重定向

    输出重定向

    ls -l > dat.txt ——重定向到文件,会创建新文件

    ls -l >> dat.txt ——追加到文件末尾

    ls -l > /dev/null ——空洞文件

    ls xxx > txt  ——文件不存在,则无法重定位,会输出错误信息

    ls xxx > txt 2>&1 ——成功,1代表标准输出,2>&1表示2等同于1

    输入重定向

    cat >> dat.txt <<R   ——表示以R结束!(输入想要的数据后输入R结束)

    read var <dat.txt ——将dat.txt中的第一行作为值付给变量var

    管道

    du -ah | sort -n ——列出一个目录的所有文件,按文件大小排序

    ps aux | grep MySQL ——查看服务

    rpm -qa | grep vsftpd ——查看软件是否已经安装可以使用这个方法 

    第四节:数学运算

    (expr   ()   let)

    expr 1 + 2 ——注意要有空格 expr格式要求较高

    var=$(expr 1 * 8) ——*要用转义

    TMP=$((1+2)) ——直接使用() 不用空格

    let var=3*8

    echo $var 

    计划任务crontab -e进入编辑

    第五节:引用

    1.双引号:使用双引号可以输出除$、`、 以外的任意字符

    echo “$hello world” ——输出 world

    2.单引号:使用单引号会忽略任何的引用值

    hello=10   echo ‘$hello’——输出$hello

    3.反引号:用于将系统命令输出到变量

    echo `ls` ——相当于执行ls命令

    echo “`ls` Hello world” ——执行ls命令后继续打印hello world

    4.反斜线:防止shell误解特殊含义的字符

    如&  *  +  |  ?   $等等

    第六节:grep和正则表达式

    1.grep常用 grep -n(显示行号)  -r(递归)   -v(取反)  --color  --include等选项。

    grep -nr “Hello” /home /var --include=*.c

    2.正则表达式

    元字符:[ ]    ^  $  . ?  |  *  +  (  )

    ^  ——匹配行首 ls | grep ^[0-9]以0-9开头的;  ls |grep ^[^A]以非A开头的

    $  ——匹配行尾 ls | grep c$以c结尾的, 还可以使用’ ’  ls |grep ‘^[m]c$’

    *  ——匹配0次或多次

    ?  ——匹配0次或1次

    .  ——匹配任意单字符

    partten{n}    ——匹配前面partten出现次数 n为次数

    grep --color '^[0-9]{3}' txt

    partten{n,}    ——匹配前面partten出现次数 n为至少出现次数

    grep --color '^[0-9]{1,}' txt

    partten{n,m}  ——匹配前面partten出现次数 出现次数为n-m之间

    grep --color '^[0-9]{1,3}' txt

    3.匹配开头和结尾字符

    grep ‘^[hello]’ txt ——以hello开头,或grep ‘^hello’ txt

    grep ‘hello$’ txt ——以hello结尾的单词

    grep ‘^Hello’ txt ——匹配整个单词Hello  

    第七节:sed命令

    -n -p选项

    sed  ‘p’ filename  ——查看文件内容 p代表print 注意:会显示两行

    sed -n ‘p’ filename ——加上-n 表示只输出模式空间的内容

    sed -n ‘1 p’ filename  ——只打印第一行 2 p打印前两行

    sed -n ‘1,3 p’ filename  ——打印1-3行

    sed -n ‘/main/ p’ file ——打印含有main的行

    sed -n ‘/^main/ p’ file ——打印以main开头的行

    sed -n ‘/main$/ p’ file ——打印以main结尾的行

    sed -n ‘/^[0-9]/{3} p’ file——以数字开头 并出现三次

    -d选项(delete),与p用法类似:

    sed ‘1,3 d’ file ——删除1-3行

    -f选项:从文件中读入命令 建立文件cmd.sed 如内容:/main/ p

    sed -f cmd.sed  filename

    -e选项:后面可以接多个命令

    sed -n ‘/main/ p’ -e ‘/hello/ p’  filename

    -i重要!

    -i选项,会直接操作到文件内容

    -s替换:

    sed ‘1 s/main/hello/’ filename ——把第一行中main换成hello

    sed ‘/main/ s/he/llo/’ filename ——把main所在字符串所在中he换成llo

    sed ‘2  /main/ s/he/llo/’ filename ——把第二行且含有main的行中he换成llo

    如果没有address-range和partten-range,就会操作到所有行,如

    sed  ‘s/main/hello/’ filename ——把所有行中的main换成hello

    substitute-flags:

    g(global):全局开关   sed  ‘s/main/hello/g’ filename

    数字:把每一行第n个符合条件的替换 sed  ‘s/main/hello/2’ filename 

          第二个出现的main

    p:打印,不多说

    w(write):输出到文件 sed ‘ s/main/hello/w out.txt’ filename

    i(ignore):忽略大小写

    各种标记可以联合使用:

       sed ‘s/main/fuck/gipw 2.txt’  filename 

    &:

       sed ‘s/main/[&]/’ filename 把每一行main换为[main]

    实例:ll > txt

    txt中内容如下:

    总用量 32

    drwxrwxr-x.  7 xxx xxx 4096 10月 18 20:19 install

    -rw-rw-r--.  1 xxx xxx 0 12月 18 21:12 txt

    drwxr-xr-x.  9 xxx xxx 4096  9月  5 17:22 vim

    drwxrwxr-x.  9 xxx xxx 4096 12月 15 21:48 work

    我只想要得到txt那一行的21:12

    怎么做?

    答案:

    cat txt | grep txt | sed 's/.*..:...*/1/g'

       又如echo "hello my world" | sed 's/.*my.*/[1]/'这样输出:[my] 

    第八节.AWK命令

    awk命令

    比较好的参考资料:

    http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html

    格式1:awk -Fs ‘BEGIN{ } / parten/ {action} END{ }’

    action中的内容会循环执行 begin与end的内容只会执行一次

    awk -F, ‘print $1,$2,$3’ txt ——按逗号分隔成每一个段 打印每一个段

    加逗号会输出空格 以方便我们观察

    awk -F, ‘print $1 $2 $3’ txt ——这样的会打印出来的没有逗号分隔 

    也可以不加逗号,加| 、 制表符等等,如下:

    awk -F, ‘print $1”|”$2”|”$3’ txt

    awk -F, ‘print $1” ”$2 “ ”$3’ txt

    awk -F, ‘/main/ print $1,$2,$3’ txt——匹配含有main的行

    awk -F. '/txt/ {print $1 " " $2}' txt——以.作为分隔符。。。

    内置变量:

    FS内置变量 代表分隔符 OFS代表输出分隔符

    awk 'BEGIN{FS=","; OFS=" "; printf("=================== ")} {print $1,$2, $3} END{print("===================")}' txt

    可以指定多个分隔符,如 .  :  %三个

    awk 'BEGIN{FS=[.:%]; OFS=" "; printf("=================== ")} {print $1,$2, $3} END{print("===================")}' txt

    指定分隔符并换行RS

    文件内容:

    101

    lvy

    BOSS

    -

    102

    XXX

    XXX

    -

    103

    QQQ

    QQQ

    -

    要求得到格式如:

    lvy:BOSS

    XXX:XXX

    QQQ:QQQ

    答案:

     awk 'BEGIN{FS=" "; OFS=":"; RS="- "} {print $2,$3} END{}' txt

    输出分隔符ORS

     awk 'BEGIN{FS=" "; OFS=":"; RS="- "; ORS=" ---------- "} {print $2,$3} END{}' txt

    用在在每一行执行完毕后输出一些内容。。。

    lvy:BOSS

    ----------

    XXX:XXX

    ----------

    QQQ:QQQ

    ----------

    awk中print与printf

    print中不需要对变量进行处理,如果是字符串 加双引号

    printf与C语言中的用法是一样的。

    复习AWK:

     awk '{print $0}' txt ——打印txt中所有行

     awk 'BEGIN{OFS=":";RS="- "} {print $2,$3}' txt

    默认的域分隔符是空格  域分隔符使用-F指定

    sudo cat /etc/passwd | awk -F: '{print $1}' ——冒号作为域分隔符

    对比sudo cat /etc/passwd | awk '{print $1}'看看

    统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容:

    awk  -F ':'  '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd

    awk 'BEGIN{print("Hello"); FS=".";} {print FILENAME, NR, $2} END{print("World!")}' txt

    FILENAME代表文件名;NR代表行号;NF代表列数 $NF可以取最后列

    自定义变量:

    必须以字符开始,不能使用内置变量,最好放在begin段中

    awk  -f  xxx.awk  file ——  -f选项指定可以在后面接一个awk脚本。

    必须是下面这种形式 BEGIN{要放在一行

    BEGIN{

       total=0;

    }

    {

       total += 1;

    }

    END{

       print “total is :”, total;

    }

    一元运算符:+返回数字本身  - 改变数字的符号   ++递增操作

    算术运算符:+ - * /

    字符串连接:str = str1”__”str2; 可以连接

    比较/逻辑运算符:>  >=  <  <=  &&  || 等

    正则表达式:~匹配   !~不匹配

    实例:统计/etc/passwd下有多少用户使用/bin/bash

     cat /etc/passwd | awk -F: 'BEGIN{NUM=0;} //bin/bash/ {print $NF; NUM++;} END{print "The number who use /bin/bash is:", NUM}'

    AWK条件与循环:

    与c语言一样,awk中也有条件、循环语句

    例子:awk -F, ‘{if ($3 == 500) print $1; else print “Not Found!”;}’ /etc/passwd

    第九节.shell环境

    变量别名:shell中输入alias ll=”ls -l”

    如果想退出终端后还有效的话 就写入~/.bashrc

    stty -echo ——设置输出不回显 可以再输入密码时,设置。

    stty echo  ——回显

    cal ——查看日历 

    cal [[day][month]year]  [代表是可选的]  cal 7 2014表示查看2014年7月份

    data ——查看时间

    date “+%A” 查看星期几

    date "+%Y-%m-%d %H:%M:%S" ——显示2014-12-26 21:06:29

    find命令补充:find [option] [-exec | -ok] command {} ;

    -exec、-ok选项  -exec是不安全的,-ok是安全的

    find /home -name test.txt -exec rm {} ; ——找到后会立刻删除,不会提示

    find . -name aaa -ok rm {} ; ——会提示是否删除

    find . -name aaa -exec cp {} /home ; 

    -xargs选项 

    find . -name aaa | xargs rm

    find . -name aaa | xargs -i mv {} /opt

    实例:查找当前目录下非.c的文件 并进行删除:

    find . -type f ! -name *.c | xargs rm -f  ——注意感叹号的位置

    第十节.shell脚本编程

    shell条件语句:

          if list then 
              do something here 
          elif list then 
              do another thing here 
          else 
             do something else here 
          fi    

    EX1:

    #!/bin/sh

    SYSTEM=`uname -s`        #获取操作系统类型

    if [ $SYSTEM = "Linux" ] ; then     #如果是linux的话打印linux字符串 注意[]中两边的空格
    echo "Linux" 
    elif [ $SYSTEM = "FreeBSD" ] ; then   
    echo "FreeBSD" 
    elif [ $SYSTEM = "Solaris" ] ; then 
    echo "Solaris" 
    else 
    echo "What?" 
    fi     #ifend

    基本上和其他脚本语言一样。没有太大区别。不过值得注意的是。[]里面的条件判断。

    1 字符串判断

    str1 = str2      当两个串有相同内容、长度时为真 
    str1 != str2      当串str1和str2不等时为真 
    -n str1        当串的长度大于0时为真(串非空) 
    -z str1        当串的长度为0时为真(空串) 
    str1           当串str1为非空时为真

    2 数字的判断

    int1 -eq int2    两数相等为真 
    int1 -ne int2    两数不等为真 
    int1 -gt int2    int1大于int2为真 
    int1 -ge int2    int1大于等于int2为真 
    int1 -lt int2    int1小于int2为真 
    int1 -le int2    int1小于等于int2为真

    3 文件的判断

    -r file     用户可读为真 
    -w file     用户可写为真 
    -x file     用户可执行为真 
    -f file     文件为正规文件为真 
    -d file     文件为目录为真 
    -c file     文件为字符特殊文件为真 
    -b file     文件为块特殊文件为真 
    -s file     文件大小非0时为真 
    -t file     当文件描述符(默认为1)指定的设备为终端时为真

    3 复杂逻辑判断

    -a         与 
    -o        或 
    !        非

    一些预定义的变量:

    linux中shell变量$#,$@,$0,$1,$2的含义解释: 
    $$    Shell本身的PID(ProcessID) 

    $!    Shell最后运行的后台Process的PID 
    $?    最后运行的命令的结束代码(返回值) 
    $-    使用Set命令设定的Flag一览 
    $*    所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 
    $@   所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。 
    $#   添加到Shell的参数个数 
    $0   Shell本身的文件名 
    $1~$n  添加到Shell的各参数值。$1是第1参数、$2是第2参数…。 

    补充:

        filename1 -nt filename2 如果 filename1 比 filename2 新,则为真 [ /tmp/install/etc/services -nt /etc/services ]

        filename1 -ot filename2 如果 filename1 比 filename2 旧,则为真 [ /boot/Image -ot arch/i386/boot/bzImage ]

     转自:http://blog.csdn.net/scottly1/article/details/42197997

  • 相关阅读:
    数据库准入规则
    ubuntu go 开发环境搭建
    PHP 异步执行方式
    python 连接 hive数据库环境搭建
    Swift 发送邮件和附件
    python 爬取动态数据
    git 新建项目的一些操作
    php 爬取数据
    通过NGINX location实现一个域名访问多个项目
    Linux系统Web网站目录和文件安全权限设置
  • 原文地址:https://www.cnblogs.com/weizhixiang/p/6557270.html
Copyright © 2011-2022 走看看