• shell及脚本2——shell 环境及命令


    一.快捷键、通配符、特殊符号

    1. 快捷键

    CTRL+C:终止目前的命令

    CTRL+D:输入结束,EOF

    CTRL+M:ENTER

    CTRL+S:暂停屏幕输出

    CTRL+Q:恢复屏幕输出

    CTRL+U:将整行命令删除

    CTRL+Z:暂停目前的命令

    2.通配符

    *  任意多个字符

    ? 任意1个字符

    [] 1个括号中的字符,例如[abcd]表示a/b/c/d中的任意1个

    [-] 在编码顺序内的所有字符,例如[0-9]表示0,1,2,3,4,5,6,7,8,9所有这些数

    [^] 反向选择,[^abc]表示只要不是a/b/c的字符

    3.特殊符号

    # 注释

    \ 转移符

    | 管道,分隔两个管道命令

    ; 连续命令分隔

    ~ 用户主文件夹  home/username

    $ 变量前导符,使用变量时需要添加

    & 后台工作

    ! 非

    / 目录

    >,>> 数据流重定向,输出, >替换,>>累加

    <,<< 数据流重定向,输入

    ' '  单引号内的特殊符号失去特殊意义

    " "  双引号内的特殊符号保留特殊意义

    ·· 反向单引号,可以执行命令

    () 括号内为子shell

    {} 命令块组合

    二、数据流重定向

    标准输出stdout:命令执行正确,输出的信息,一般默认为屏幕,代码为1,使用>或>>

    错误输出stderr:命令执行错误,输出的信息,一般默认为屏幕,代码为2,使用2>或2>>

    标准输入stdin:代码为0,使用<或<<

    @ubuntu:~/test$ ls ./no_dir
    ls: cannot access ./no_dir: No such file or directory
    @ubuntu:~/test$ ls ./no_dir 2>ls_err   // standard err 信息重定位到文件ls_err中,屏幕不再显示
    @ubuntu:~/test$ cat ls_err         //  ls_err文件中保存了刚才的standard err信息
    ls: cannot access ./no_dir: No such file or directory
    @ubuntu:~/test$ ls ./no_dir 2>>ls_err  //  >>累加
    @ubuntu:~/test$ cat ls_err 
    ls: cannot access ./no_dir: No such file or directory
    ls: cannot access ./no_dir: No such file or directory
    @ubuntu:~/test$ ls ./no_dir 2> /dev/null   // /dev/null垃圾桶,能吃掉任何导入到此设备的信息

    特殊需求:把stdout和stderr都输出到同一文件中

     >out_file  2>out_file        // 不对,stdout和stderr同时输出,out_file可能顺序混乱
    >out_file 2>&1 // 正确, &1很关键,&表示1不是文件,而是stdou

    三 命令执行顺序

    cmd1  ;  cmd2  // com1和com2顺序执行,没有条件
    cmd1 && cmd2  // if(cmd1正确) cmd2
    cmd1 ||  cmd2  // if(cmd1不正确) cmd2

    &&和||的组合,一般遵循 cmd1 && cmd2 || cmd3, cmd1可能成功或失败,cmd2和cmd3一般都是成功的

    *@ubuntu:~/test$ ls no_dir &&  echo "exist" || echo "not exit"
    ls: cannot access no_dir: No such file or directory
    not exit
    *@ubuntu:~/test$ ls no_dir ||  echo "not exist" && echo "exit"  // 与预期不符合,cmd2执行成功,cmd3也执行了
    ls: cannot access no_dir: No such file or directory
    not exist
    exit

    四 管道及管道命令 

    1.管道

    前一个命令的stdout作为后一个命令的stdin,不是所有命令都能接收前一个命令的数据,例如ls,cp等就不行。

    ~$ ls /etc | less  // ls /etc的stdout是一堆文件,这些信息作为less的stdin

    2.选取命令:cut,grep

    (1)cut:从一行数据中切出某一段
    cut -d '分割字符' -f fields   // 用-d后面的分隔符把一段信息分割成几段,然后用-f取出第几段 cut -c 字符范围 // 以字符范围取出固定个字符
    :~$ echo $PATH
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
    :~$ echo $PATH | cut -c 5-  #从第5个字符取到结尾
    /local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
    :~$ echo $PATH | cut -c 5-10 #取字符5-10
    /local
    :~$ echo $PATH | cut -d ':' -f 3  #以:为分隔符,取第3段
    /usr/sbin
    

     (2)grep:分析一行数据,如果有我们所需要的信息,就将该行拿出来。

      grep [-acinv] [--color=auto] '查找字符串' filename

      -a:将binary文件以text文件的方式查找数据

      -c:计算'查找字符串'的次数

      -i:忽略大小写

      -n:输出行号

      -v:反向选择

     --color=auto:关键字加颜色显示

    :/$ ls -lh / | grep -n 'bin'
    2:drwxr-xr-x   2 root       root       4.0K 12月 24 21:26 bin
    18:drwxr-xr-x   2 root       root        12K 12月 24 21:26 sbin

    3.排序命令:sort,wc,uniq

    (1).sort:排序,依据不同的数据类型排序

    sort [-fbMnrtuk]  [file or stdin]

    -f:忽略大小写

    -b:忽略最前面的空格

    -M:以月份的名字排序

    -n:使用纯数字排序,默认是文字类型

    -r:反向排序

    -u:uniq,相同的数据,仅列出1行

    -t:分隔符,默认tab

    -k:以哪个区间进行排序,一般与-t连用

    :/$ cat /etc/passwd | sort  #首字符排序
    _apt:x:105:65534::/nonexistent:/bin/false
    avahi-autoipd:x:110:119:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/bin/false
    avahi:x:111:120:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/false
    backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
    bin:x:2:2:bin:/bin:/usr/sbin/nologin
    colord:x:113:123:colord colour management daemon,,,:/var/lib/colord:/bin/false
    ......
    liuwanpeng@liuwanpeng-virtual-machine:/$ cat /etc/passwd | sort -t ':' -k 3  #:分隔后的第三个段排序,默认字符
    root:x:0:0:root:/root:/bin/bash
    liuwanpeng:x:1000:1000:liuwanpeng,,,:/home/liuwanpeng:/bin/bash
    systemd-timesync:x:100:102:systemd Time Synchronization,,,:/run/systemd:/bin/false
    systemd-network:x:101:103:systemd Network Management,,,:/run/systemd/netif:/bin/false
    usbmux:x:120:46:usbmux daemon,,,:/var/lib/usbmux:/bin/false
    ......
    liuwanpeng@liuwanpeng-virtual-machine:/$ cat /etc/passwd | sort -t ':' -k 3 -n  #:分隔后的第三个段排序,按数字排序
    root:x:0:0:root:/root:/bin/bash
    daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
    bin:x:2:2:bin:/bin:/usr/sbin/nologin
    ......

    (2).wc:数数字,多少字,多少行,多少字符

    wc [-lwm]

    -l:列出行数

    w:列出多少字(英文单子)

    m:多少字符

    :/$ cat /etc/passwd |wc
         45      74    2545  #45行 74字数 2545字符

    (3).uniq:重复的数据仅显示1个

    uniq [-ic]

    -i:忽略大小写

    -c:进行计数

    4.双向重定向:tee

    同时向stdout和file中存放结果

    tee [-a] file

    -a:累加方式

    :~$ ls / | tee ~/ls_result  #在屏幕显示结果的同时,将结果存入文件ls_result中

    5.字符转换命令:tr,col,join,paste,expand

    (1).tr:删除或替换一段信息中的文字,!只能等字符替换

    tr [-ds] SET1 [SET2]

    -d:删除SET1字符串

    -s:替换掉重复的字符

    :~$ echo $PATH
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:~$ echo $PATH | tr -d 'bin'  #删除bin
    /usr/local/s:/usr/local/:/usr/s:/usr/:/s:/:/usr/games:/usr/local/games:~$ echo $PATH | tr  'bin' 'bin_replace'  #没达到效果,只能等字符替换
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:~$ echo $PATH | tr  'bin' 'replace'
    /usr/local/srep:/usr/local/rep:/usr/srep:/usr/rep:/srep:/rep:/usr/games:/usr/local/games:~$ echo $PATH | tr  'bin' 'nib'
    /usr/local/snib:/usr/local/nib:/usr/snib:/usr/nib:/snib:/nib:/usr/games:/usr/local/games

    (2).col:

    col [-xb]

    -x:将TAB键换成对等的空格键

    -b:文字中有反斜杠/时,只保留反斜杠最后接的那个字符

    (3).join:将两个文件有相同数据的那一行加在一起,处理两个相关文件时比较有用

    jion [-ti12] field1 field2

    -t:分隔符,默认为空格,且默认对比第1个字符

    -i:忽略大小写

    -1:要用第一个文件的哪个字段比对

    -2:要用第二个文件的哪个字段对比

    :~$ sudo head -n 3 /etc/passwd /etc/shadow
    ==> /etc/passwd <==
    root:x:0:0:root:/root:/bin/bash
    daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
    bin:x:2:2:bin:/bin:/usr/sbin/nologin
    
    ==> /etc/shadow <==
    root:!:17159:0:99999:7:::
    daemon:*:16911:0:99999:7:::
    bin:*:16911:0:99999:7:::
    
    :~$ sudo join -t ':' -1 3 -2 4 /etc/passwd /etc/shadow 0:root:x:0:root:/root:/bin/bash:root:!:17159:99999:7:::    #第2个文件的第4个元素不显示了 0:root:x:0:root:/root:/bin/bash:daemon:*:16911:99999:7::: 0:root:x:0:root:/root:/bin/bash:bin:*:16911:99999:7:::

    (4).paste:直接将两行粘贴到一起,中间用tab键隔开

    paste [-d] file1 file2

    -d:分隔符,默认是tab

    -:如果file部分是-,表示标准输入stdin,可以理解成paste不能直接读取stdin,需要通过“-”把stdin转换成命令的输入文件

    liuwanpeng@liuwanpeng-virtual-machine:~$ sudo paste /etc/passwd /etc/shadow | head -n 3
    root:x:0:0:root:/root:/bin/bash    root:!:17159:0:99999:7:::
    daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin    daemon:*:16911:0:99999:7:::
    bin:x:2:2:bin:/bin:/usr/sbin/nologin    bin:*:16911:0:99999:7:::
    
    liuwanpeng@liuwanpeng-virtual-machine:~$ sudo cat /etc/group |sudo paste /etc/passwd /etc/shadow - | head -n 3
    root:x:0:0:root:/root:/bin/bash    root:!:17159:0:99999:7:::    root:x:0:
    daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin    daemon:*:16911:0:99999:7:::    daemon:x:1:
    bin:x:2:2:bin:/bin:/usr/sbin/nologin    bin:*:16911:0:99999:7:::    bin:x:2:

    (5).expand:将tab键转换成空格键

    expand [-t] file

    -t:默认tab=8空格,也可以在-t后面加数字自己设置空格的数量

    6.切割命令:split

    把大文件依据文件大小或行数切割成小文件

    split [-bl] file PREFIX

    -b:文件大小,单位可用b、k、m

    -l:以行数切割

    :/work/platform-zynq/linux-xlnx-repo-smp/arch/arm/boot$ split -b 1m uImage uImage  #切割:/work/platform-zynq/linux-xlnx-repo-smp/arch/arm/boot$ cat uImagea* >> uImage_new   #合成新文件
    :/work/platform-zynq/linux-xlnx-repo-smp/arch/arm/boot$ ls -lh
    总用量 20M-rw-rw-r-- 1 liuwanpeng liuwanpeng 3.3M 12月 27 16:08 uImage
    -rw-rw-r-- 1 liuwanpeng liuwanpeng 1.0M 12月 27 16:09 uImageaa
    -rw-rw-r-- 1 liuwanpeng liuwanpeng 1.0M 12月 27 16:09 uImageab
    -rw-rw-r-- 1 liuwanpeng liuwanpeng 1.0M 12月 27 16:09 uImageac
    -rw-rw-r-- 1 liuwanpeng liuwanpeng 239K 12月 27 16:09 uImagead
    -rw-rw-r-- 1 liuwanpeng liuwanpeng 3.3M 12月 27 16:11 uImage_new    #与uImage大小一样
    

    7.参数代换:xargs

    产生命令的参数,而不是产生命令的输入,用例子说明最明白

    :~/test$ ls  #两个文件
    file1  file2
    :~/test$ cat file1 file2 #两个文件的内容
    this is file 1
    this is file 2
    :~/test$ find -name "*" . ./file2 ./file1 :~/test$ find -name "*" |grep 'file'  #在find命令的stdout信息中找file,能找到 ./file2 ./file1 :~/test$ find -name "*" |grep 'this'  #在find命令的stdout信息中找this,肯定内有,因为this在文件的内容里:~/test$ find -name "*" |xargs grep 'this’ #把find找到的两个文件作为参数传给grep,grep在这两个文件里找this,找到了
    grep: .: 是一个目录 ./file2:this is file 2 ./file1:this is file 1
    :~/test$  grep 'this' file1 file2  #使用xargs后相当于此命令
    file1:this is file 1
    file2:this is file 2

    8.减号-的作用

    替代stdout或者stdin

    tar -cvf - /home | tar -xvf -    #第一个减号,表示tar包不存到文件,而是存到stdout
                         #管道把第一个命令的stdout(tar包)转化为第二个命令的stdin
    #第二个-号表示解压stdin
  • 相关阅读:
    面向对象、面向接口、面向方法编程的区别?
    面向接口、对象、方面编程区别 -- 精简版
    面向接口编程详解(一)——思想基础
    吴裕雄--天生自然数据结构:静态链表及其创建
    吴裕雄--天生自然数据结构:单链表的基本操作
    吴裕雄--天生自然数据结构:单链表,链式存储结构
    吴裕雄--天生自然数据结构:顺序表的基本操作
    吴裕雄--天生自然Python Matplotlib库学习笔记:matplotlib绘图(2)
    吴裕雄--天生自然Python Matplotlib库学习笔记:matplotlib绘图(1)
    吴裕雄--天生自然Numpy库学习笔记:NumPy Matplotlib
  • 原文地址:https://www.cnblogs.com/liuwanpeng/p/6203784.html
Copyright © 2020-2023  润新知