linux指南之六

AIX shell 高级程序设计基础

  1. shell
    shell是一个命令解释器,是介于操作系统kernel与用户之间的一个绝缘层

    不使用shell
    资源密集型的任务,尤其在需要考虑效率时(比如,排序,hash等等)
    需要处理大任务的数学操作,尤其是浮点运算,精确运算,或者复杂的算术运算(这种情况一般使用C++或FORTRAN来处理)
    有跨平台移植需求(一般使用C或Java)
    复杂的应用,在必须使用结构化编程的时候(需要变量的类型检查,函数原型,等等)
    对于影响系统全局性的关键任务应用。
    对于安全有很高要求的任务,比如你需要一个健壮的系统来防止入侵,破解,恶意破坏等等.

  2. Vi编辑器使用

    vi/vim 中可以使用

    :s 命令来替换字符串。
    :s/well/good/ 替换当前行第一个 well 为 good
    :s/well/good/g 替换当前行所有 well 为 good
    :n, s/well/good/nwellgood:n, s/well/good/g 替换第 n 行开始到最后一行中每一行所有 well 为 good
    n 为数字,若 n 为 .,表示从当前行开始到最后一行
    :%s/well/good/(等同于 :g/well/s//good/) 替换每一行的第一个 well 为 good
    :%s/well/good/g(等同于 :g/well/s//good/g) 替换每一行中所有 well 为 good
    可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符
    :s#well/#good/# 替换当前行第一个 well/ 为 good/
    :%s#/usr/bin#/bin#g
    可以把文件中所有路径/usr/bin换成/bin
    剪切 拷贝 粘贴

    删除一行:dd
    删除一个单词/光标之后的单词剩余部分:dw
    删除当前字符:x
    光标之后的该行部分:d ddd 删除以当前字符开始的一行字符
    ndd 删除以当前行开始的n行
    dw 删除以当前字符开始的一个字
    ndw 删除以当前字符开始的n个字
    D 与d$同义
    d) 删除到下一句的开始
    d} 删除到下一段的开始
    d回车 删除2行
    ndw 或 ndW 删除光标处开始及其后的 n-1 个字符。
    d0 删至行首。
    d$ 删至行尾。
    ndd 删除当前行及其后 n-1 行。
    x 或 X 删除一个字符。
    Ctrl+u 删除输入方式下所输入的文本。
    ^R 恢复u的操作
    J 把下一行合并到当前行尾
    V 选择一行
    ^V 按下^V后即可进行矩形的选择了
    aw 选择单词
    iw 内部单词(无空格)
    as 选择句子
    is 选择句子(无空格)
    ap 选择段落
    ip 选择段落(无空格)
    D 删除到行尾
    x,y 删除与复制包含高亮区
    dl 删除当前字符(与x命令功能相同)
    d0 删除到某一行的开始位置
    d^ 删除到某一行的第一个字符位置(不包括空格或TAB字符)
    dw 删除到某个单词的结尾位置
    d3w 删除到第三个单词的结尾位置
    db 删除到某个单词的开始位置
    dW 删除到某个以空格作为分隔符的单词的结尾位置
    dB 删除到某个以空格作为分隔符的单词的开始位置
    d7B 删除到前面7个以空格作为分隔符的单词的开始位置
    d) 删除到某个语句的结尾位置
    d4) 删除到第四个语句的结尾位置
    d( 删除到某个语句的开始位置
    d) 删除到某个段落的结尾位置
    d{ 删除到某个段落的开始位置
    d7{ 删除到当前段落起始位置之前的第7个段落位置
    dd 删除当前行
    d/text 删除从文本中出现“text”中所指定字样的位置,
    一直向前直到下一个该字样所出现的位置(但不包括该字样)之间的内容
    dfc 删除从文本中出现字符“c”的位置,一直向前直到下一个该字符所出现的位置(包括该字符)之间的内容
    dtc 删除当前行直到下一个字符“c”所出现位置之间的内容
    D 删除到某一行的结尾
    d$ 删除到某一行的结尾
    5dd 删除从当前行所开始的5行内容
    dL 删除直到屏幕上最后一行的内容
    dH 删除直到屏幕上第一行的内容
    dG 删除直到工作缓存区结尾的内容
    d1G 删除直到工作缓存区开始的内容

    在vi/vim中,跳到文件首尾快捷键:
    文件开始:shift + g
    文件结束:g g

  3. bash script1 :激活脚本

    chmod 755 ./script1
    ./script1
    .script1
    source script1

    使用.(dot) 或者source命令在当前shell环境中执行脚本
    例如,为了不重起而让环境变量修改立即生效——可以使用source或者dot命令 (例如 #source /etc/profile)

  4. #!/bin/bash
    脚本将总是在bash中运行,即使用户的默认shell是其它的shell
    此时,使用dot在当前的shell中激活shell脚本不再可行了。

  5. Shell脚本参数

    $1,$2,$3 指向每个参数
    $#表示参数的个数
    $*表示所有参数的整体

    如果有很多参数(例如,文件名),则可以用shift切换参数:

  6. Ps

    Ps a 显示现行终端机下的所有程序,包括其他用户的程序
    Ps u 以用户为主的格式来显示
    Ps 显示所有程序,不以终端机来区分

  7. 元字符和通配字符
    元字符(metacharacters)指的是在shell中有特殊含义的字符。
     例如:< > | ; ! ? * [ ] $ \ ” ’ ` ~ ( ) { }
    通配字符(wildcards)是转义字符的子集,用来查找匹配文件名
     例如:? * [] [-] [!]
    通配一个字符:”?”
    通配多个字符:”*”
    高级通配符扩展
  8. 保留字

    /\

    \ 转义字符,如\X等价于“X”或‘X’. 即去掉其后所相邻字符的特殊含义
    / 文件名路径分隔符.或用来做除法操作.

    #

    #: 注释,行首以#开头为注释(#!是个例外).
    # This line is a comment.

    “” ‘’

    使用双引号只解释变量名 前缀( )()(\) .

    ;

    命令分隔符,可以用来在一行中来写多个命令.

    ;;

    终止”case”选项.

    ,

    逗号链接了一系列的算术操作,虽然里边所有的内容都被运行了,但只有最后一项被返回.
    如:
    [root@localhost train]# let “t2 = (a = 9, 15 / 3)”
    [root@localhost train]# echo $t2
    5

    :

    1 while :
             2 do
             3    operation-1
             4    operation-2
             5    ...
             6    operation-n
             7 done
             8 
             9 # 与下边相同:
            10 #    while true
            11 #    do
            12 #      ...
            13 #    done
  9. 空命令,等价于”NOP”(no op,一个什么也不干的命令).也可以被认为与shell的内建命令(true)作用相同.”:”命令是一个bash的内建命令,它的返回值为0,就是shell返回的true.

    1 while :
             2 do
             3    operation-1
             4    operation-2
             5    ...
             6    operation-n
             7 done
             8 
             9 # 与下边相同:
            10 #    while true
            11 #    do
            12 #      ...
            13 #    done

    $

    变量替换

    ()

    用在数组初始化,如:

    1 Array=(element1 element2 element3)

    cat {file1,file2,file3} > combined_file

    # 把file1,file2,file3连接在一起,并且重定向到combined_file中.

    {}

    # cp file22.{txt,backup}
    # 拷贝”file22.txt” 到”file22.backup”中

    {} \;

    路径名.一般都在find命令中使用.
    例: 查找del.txt并删除,删除前提示确认

    $ find . –name “del.txt” -ok rm {} \;   

    例:查找aa.txt 并备份为aa.txt.bak
    $ find . –name “aa.txt” -exec cp {} {}.bak \;

    [ ]

    test. test的表达式将在[]中.
    [ ] 数组元素
    Array[1]=slot_1
    echo ${Array[1]}
    [ ] 字符范围
    在正则表达式中使用,作为字符匹配的一个范围

    find

    find是个使用频率比较高的命令。常常用它在系统特定目录下,查找具有某种特征的文件。
    find命令的格式:

    find [-path……] -options [-print -exec -ok]

    path:要查找的目录路径。

    ~ 表示$HOME目录
    . 表示当前目录
    / 表示根目录

    print:表示将结果输出到标准输出。
    exec:对匹配的文件执行该参数所给出的shell命令。
    形式为command {} \;,注意{}与\;之间有空格

    ok:与exec作用相同,
    区别在于,在执行命令之前,都会给出提示,让用户确认是否执行
    options常用的有下选项:

    -name:按照名字查找
    -perm:安装权限查找
    -prune:不再当前指定的目录下查找
    -user:文件属主来查找
    -group:文件所属组来查找
    -nogroup:查找无有效所属组的文件
    -nouser:查找无有效属主的文件
    -type:按照文件类型查找

    下面通过一些简单的例子来介绍下find的常规用法:
    1、按名字查找
    在当前目录及子目录中,查找大写字母开头的txt文件

    find.name[AZ].txtprint  /etchost find /etc -name ‘host*’ -print   
    HOME find ~ -name ‘*’ -print
    在当前目录及子目录中,查找不是out开头的txt文件   
    $ find . -name “out*” -prune -o -name “*.txt” -print

    2、按目录查找   
    在当前目录除aa之外的子目录内搜索 txt文件   

    find.path./aapruneoname.txtprint  aabbtxt find . ( -path “./aa” -o -path “./bb” ) -prune -o -name “*.txt” -print   
    在当前目录,不再子目录中,查找txt文件
    $ find . ! -name “.” -type d -prune -o -type f -name “*.txt” -print

    3、按权限查找   
    在当前目录及子目录中,查找属主具有读写执行,其他具有读执行权限的文件   

    $ find . -perm 755 -print

    4、按类型查找   
    在当前目录及子目录下,查找符号链接文件   

    $ find . -type l -print

    5、按属主及属组   

    查找属主是www的文件   
    find/userwwwtypefprint   find / -nouser -type f -print   
    查找属组mysql的文件
    find/groupmysqltypefprint   find / -nogroup -type f -print

    6、按时间查找   

    查找2天内被更改过的文件
    find.mtime2typefprint  2 find . -mtime +2 -type f -print   
    查找一天内被访问的文件
    find.atime1typefprint  访 find . -atime +1 -type f -print   
    查找一天内状态被改变的文件
    find.ctime1typefprint   find . -ctime +1 -type f -print   
    查找10分钟以前状态被改变的文件
    $ find . -cmin +10 -type f -print

    7、按文件新旧   

    查找比aa.txt新的文件
    find.neweraa.txttypefprint  aa.txt find . ! -newer “aa.txt” -type f -print   
    查找比aa.txt新,比bb.txt旧的文件

    8、按大小查找   

    查找超过1M的文件
    find/size+1Mtypefprint  6 find . -size 6c -print   
    查找小于32k的文件
    find.size32kprint9  del.txt find . -name ‘del.txt’ -ok rm {} \;   
    查找aa.txt 并备份为aa.txt.bak
    $ find . -name ‘aa.txt’ -exec cp {} {}.bak \;

  10. <,>
    ASCII比较
    if [ “ veg1"<" veg2” ]

  11. 后台执行命令
    1、&命令

    #test.sh &

    该命令将脚本放到后台执行,但是标准输出还是会显示到当前终端,影响用户操作,所以最好是将输出重定向到其他文件

    #test.sh &>/dev/null

    2、通过ctrl+z;bg等命令.
    如果一个作业已经在前台执行,可以通过ctrl+z将该作业放到后台并挂起。然后通过jobs命令查看在后台执行的作业并找到对应的作业ID,执行bg %n(n为通过jobs查到的作业ID)唤醒该作业继续执行。
    jobs————查看在后台执行的进程
    fg %n———-将后台执行进程n调到前台执行,n表示jobnumber(通过jobs查看的进程编号,而非pid)
    ctrl+z———-将在前台执行的进程,放到后台并挂起
    bg %n———将在后台挂起的进程,继续执行
    ctrl+c———-前台进程终止
    kill %n———杀掉后台运行的进程,n表示jobnumber(通过jobs查看的进程编号,而非pid)
    二、如果我们需要作业在后台执行并不受用户注销退出的影响,可以用下面方式
    #nohup sh test.sh &>/dev/null &
    nohup命令会忽略SIGHUP信号,从而终端退出时不会影响到后台作业

    -

    .“cd -”将回到之前的工作目录

    ~

    home目录.相当于$HOME变量.
    ~bozo是bozo的home目录,并且ls ~bozo将列出其中的内容.
    ~/就是当前用户的home目录,并且ls ~/将列出其中的内容,
    如:

    bash$ echo ~bozo
    /home/bozo
    bash$ echo ~/
    /home/bozo/

    Ctl-B 光标后退,这应该依赖于bash输入的风格,默认是 emacs风格的.
    Ctl-C Break,终止前台工作.
    Ctl-D 从当前shell登出(和exit很像)
    Ctl-H backspace,删除光标前边的字符

  12. tee
    tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。我们可利用tee把管道导入的数据存成文件,甚至一次保存数份文件。
    : 列出文本文件slayers.story的内容,同时复制3份副本,文件名称分别为ss-copy1、ss-copy2、ss-copy3:

    $ cat slayers.story |tee ss-copy1 ss-copy2 ss-copy3

    命令1的输出,成为命令2的输入

  13. export
    用于声明一个环境变量:export variable=value
    如果在某一次运行中,手动export一个变量,则只在这次shell的使用中,才能访问这个变量,或者在该shell启动的其他程序中,也是可以访问这个变量的,因为它们是这个shell的子进程。该环境变量只在本进程和其子进程中可以访问。
    如果是在系统级的配置文件中,如/etc/profile中export 一个变量,那么这个变量就会在整个系统运行期间都起作用。
    如果在用户级~/.bash_profile之类的文件中,则每次启动shell都会去读这个文件,所以每次打开shell也是可以取到这个值的。

    $:当前shell的PID
    PATH:用于搜索可执行程序的路径
    PS1:主shell提示符

    显示用户名,主机名和动态显示当前目录

    -bash-3.00# export PS1=”[/u@/h /w]”
    [root@MagicLinux ~]cd /etc
    [root@MagicLinux /etc]

    /d 代表日期,格式为weekday month date,例如:”Mon Aug 1”
    /H 完整的主机名称。例如:我的机器名称为:fc4.linux,则这个名称就是fc4.linux
    /h 仅取主机的第一个名字,如上例,则为fc4,.linux则被省略
    /t 显示时间为24小时格式,如:HH:MM:SS
    /T 显示时间为12小时格式
    /A 显示时间为24小时格式:HH:MM
    /u 当前用户的账号名称
    /v BASH的版本信息
    /w 完整的工作目录名称。家目录会以 ~代替
    /W 利用basename取得工作目录名称,所以只会列出最后一个目录
    /# 下达的第几个命令
    /$ 提示字符,如果是root时,提示符为:# ,普通用户则为:$
    /[ 字符”[”
    /] 字符”]”
    /! 命令行动态统计历史命令次数

    PS2:第二shell提示符
    PWD: 当前工作目录
    HOME:用户的主目录
    LANG:用户的语言环境

  14. Exit状态

    echo hello
    echo $? # 返回0,因为执行成功
    lskdf # 不认识的命令.
    echo $? # 返回非0值,因为失败了.

  15. cut
    下面例子提取第3,第4,第5和第8个字符:

    $ who | cut -c 3-5,8
    croe
    croe
    croe

  16. sed
    sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。
    结果一般输出到屏幕,但文件内容并没有改变,除非你使用重定向存储输出。
    删除:d命令
    *

    $ sed ‘2d’ example #删除example文件的第二行。

    $ sed ‘2,$d’ example #删除example文件的第二行到末尾所有行。
    $ sed ‘$d’ example #删除example文件的最后一行。
    $ sed ‘/test/’d example #删除example文件所有包含test的行

    替换:s命令

    $ sed ‘s/test/mytest/g’ example
    #在整行范围内把test替换为mytest。如果没有g标记,则只有每行第一个匹配的test被替换成mytest。

    多点编辑:e命令

    $ sed -e ‘1,5d’ -e ‘s/test/check/’ example
    #(-e)选项允许在同一行里执行多条命令。如例子所示,第一条命令删除1至5行,第二条命令用check替换test。

  17. Awk
    awk也是一个强大的文本分析工具。
    相比之下,sed侧重在编辑,而awk是把文件逐行的读入,以空格为默认分隔符将每行切片为列,再进行分析处理。

    下例只显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以tab键分割:

    cat /etc/passwd |awk -F ‘:’ ‘BEGIN {print “name,shell”} {print 1"," 7} END {print “blue,/bin/nosh”}’

    搜索/etc/passwd有root关键字的所有行

    搜索支持正则,例如找root开头的:

    #awk -F: ‘/^root/’ /etc/passwd

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值