• Linux 笔记


    博客地址:http://www.moonxy.com

    一、前言

    Shell 是系统的用户界面,提供了用户与内核进行交互操作的一种接口,它接收用户输入的命令并把它送入内核去执行。实际上 Shell 是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。不仅如此,Shell 有自己的编程语言用于对命令的编辑,它允许用户编写由 shell 命令组成的程序。Shell 编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的 Shell 程序与其他应用程序具有同样的效果。

    Shell 脚本命令的工作方式有两种:交互式和批处理。

    交互式(Interactive):用户每输入一条命令就立刻执行。

    批处理(Batch):由用户事先编写好一个完整的 Shell 命令,Shell 会一次性执行脚本中的多条命令。

    二、Linux 进程管理与作业控制

    进程和作业的区别与联系:

    区别:进程是一个程序在一个数据集上的一次执行,而作业是用户提交给系统的一个任务。

    联系:一个作业通常包括几个进程,几个进程共同完成一个任务,即作业。

    用户提交作业以后,如果作业被调度,系统会为作业创建进程,一个进程无法完成时,系统会为这个进程创建子进程。

    当运行进程时,可以使用 Ctrl + Z 组合键来将其暂停,然后使用 fg(foreground)命令恢复它到前台,或者利用 bg (background)命令使它到后台运行,也可以使用 Ctrl + C 组合键来结束/终止该进程

    用 vi 或 vim 编辑一个 test1.txt 文件,随便输入 abc123,按 ESC 键退到一般模式,接着使用 Ctrl + Z 组合键暂停此任务,如下:

    [root@ryan linux]# vi test1.txt

    abc123

    [root@ryan linux]# vi test1.txt

    [1]+ Stopped vi test1.txt

    此时显示 vi test1.txt 任务已经停止了 Stopped,前面的序号1,代表的是作业的编号,输入 jobs 命令可以列出当前的任务,如下:

    [root@ryan linux]# jobs
    [1]+ Stopped vi test1.txt

    然后使用 fg + 编号, 可以恢复该任务,此时又会进入刚才 vi 的一般模式窗口中了,再此将其暂停,如下:

    [root@ryan linux]# fg 1
    vi test1.txt

    [1]+ Stopped vi test1.txt

    如果想将任务放在后台运行,可以使用 bg + 编号,如下:

    [root@ryan linux]# bg 1
    [1]+ vi test1.txt &

    [1]+ Stopped vi test1.txt

    此时 vi test1.txt 的状态仍然为 Stopped,表示该任务不支持在后台运行,否则应该为 Running 状态。我们换成其他的命令,如监控系统资源的命令 vmstat,vmstat 1 表示每隔一秒钟输出一次系统状态,如下:

    [root@ryan linux]# vmstat 1 >/tmp/vm.log

    执行之后,按 Ctrl + Z 键暂停,此时显示如下:

    [root@ryan linux]# vmstat 1 >/tmp/vm.log
    ^Z
    [2]+ Stopped vmstat 1 > /tmp/vm.log

    输入 jobs 查看任务,如下:

    [root@ryan linux]# jobs
    [1]- Stopped vi test1.txt
    [2]+ Stopped vmstat 1 > /tmp/vm.log

    输入 bg + 编号,将其放入后台运行,如下:

    [root@ryan linux]# bg 2
    [2]+ vmstat 1 > /tmp/vm.log &

    此时再使用 jobs 查看,如下:

    [root@ryan linux]# jobs
    [1]+ Stopped vi test1.txt
    [2]- Running vmstat 1 > /tmp/vm.log &

    发现第二个任务的状态变成了 Running 状态了,表示此命令在后台运行了。

    注意:

    放入后台运行的命令,后边会添加 & 符号,且前面有个空格。

    作业编号后面的加号 + 表示该作业是默认作业,减号 - 表示该作业是下一个默认作业,即第二默认作业。

    此时,如果想结束该任务,如果你还在刚才的 Shell 中(第一种情况),可以使用 fg + 编号 将任务调入前台,然后按 Ctrl + C 组合键来结束任务,如下:

    [root@ryan linux]# fg 2
    vmstat 1 > /tmp/vm.log
    ^C

    当然,你可以可以使用 ps aux |grep vmstat 来找到其进程号,来强制终止进程。

    另一种情况,已经关闭了刚才的 shell,再次打开另一个 shell 后,使用 jobs 命令并不会显示在后台运行或者被暂停的任务,要关闭这些任务,需要找他们的进程号 pid,如下:

    [root@ryan ~]# ps aux |grep vmstat
    root 1910 0.0 0.0 6260 696 pts/0 S 13:21 0:00 vmstat 1
    root 1938 0.0 0.0 103308 876 pts/1 S+ 13:28 0:00 grep vmstat

    此处的 1910 即为要结束的任务进程 pid,使用 kill 命令,结束该进程,如下:

    [root@ryan ~]# kill 1910

    如果遇到结束不掉的进程,可以添加参数 -9,即 kill -9 [pid],表示强制结束。

    结束进程之后,重新查看,发现已经不存在 vmstat 1 进程了。

    [root@ryan ~]# ps aux |grep vmstat
    root 1944 0.0 0.0 103308 876 pts/1 S+ 13:32 0:00 grep vmstat

    注意:

    我们也可以直接将任务放在后台运行,如下:

    [root@ryan linux]# vmstat 2 >/tmp/vm2.log &
    [1] 1947

    此处的 [1] 表示作业编号1,1947 表示进程号 pid。

    使用 jobs 查看任务,如下:

    [root@ryan linux]# jobs
    [1]+ Running vmstat 2 > /tmp/vm2.log &

    使用 ps aux |grep vmstat 查看进程

    [root@ryan linux]# ps aux |grep vmstat
    root 1947 0.0 0.0 6260 696 pts/0 S 13:40 0:00 vmstat 2
    root 1949 0.0 0.0 103308 872 pts/0 S+ 13:42 0:00 grep vmstat

    总结如上使用到的操作及命令:

    Ctrl + Z 组合键暂停一个前台进程;

    Ctrl + C 组合键终止一个前台进程;

    fg - Resume jobspec in the foreground, and make it the  current  job.恢复一个作业到前台,并作为当前作业;

    bg - Resume each suspended job jobspec in the background, as if it had been started with &.恢复一个作业到后台,仿佛为其添加了 & 符号;

    jobs - The first form lists the active jobs. 列出活动的作业;

    ps - report a snapshot of the current processes.显示一个当前进程的快照;

    kill - terminate a process.结束一个进程;

    要将某条命令放入后台运行,可以在其后面添加空格,然后添加 & 符号。

    通常,终止一个前台进程可以使用 Ctrl+C 键,但是,对于一个后台进程就须用 kill 命令来终止,我们就需要先使用 ps/pidof/pstree/top 等工具获取进程 PID,然后使用 kill 命令来杀掉该进程。

    将命令放入后台运行可将 & 与 nohup 命令配合使用:

    &
    当在前台运行某个作业时,终端被该作业占据;可以在命令后面加上 & 实现后台运行。例如:sh test.sh &

    适合在后台运行的命令有 find、费时的排序及一些 shell 脚本。在后台运行作业时要当心:需要用户交互的命令不要放在后台执行,因为这样你的机器就会在那里傻等。不过,作业在后台运行一样会将结果输出到屏幕上,干扰你的工作。如果放在后台运行的作业会产生大量的输出,最好使用下面的方法把它的输出重定向到某个文件中:

    command > out.file 2>&1 &

    这样,所有的标准输出和错误输出都将被重定向到一个叫做 out.file 的文件中。2>&1 是将标准出错重定向到标准输出,这里的标准输出已经重定向到了out.file文件,即将标准出错也输出到out.file文件中。最后一个 &, 是让该命令在后台执行。

    当你成功地提交进程以后,就会显示出一个进程号,可以用它来监控该进程,或杀死它。(ps -ef | grep 进程号 或者 kill -9 进程号)

    nohup

    使用 & 命令后,作业被提交到后台运行,当前控制台没有被占用,但是一但把当前控制台关掉(退出帐户时),作业就会停止运行。nohup 命令可以在你退出账户之后继续运行相应的进程。nohup 就是不挂起的意思(no hang up)。该命令的一般形式为:

    # nohup command &

    如果使用 nohup 命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为 nohup.out 的文件中,除非另外指定了输出文件:

    # nohup command > myout.file 2>&1 &

    使用了 nohup 之后,很多人就这样不管了,其实这样有可能在当前账户非正常退出或者结束的时候,命令还是自己结束了。所以在使用 nohup 命令后台运行命令之后,需要使用exit正常退出当前账户,这样才能保证命令一直在后台运行。

    2>&1 是将标准出错重定向到标准输出,这里的标准输出已经重定向到了 out.file 文件,即将标准出错也输出到 out.file 文件中。最后一个 &, 是让该命令在后台执行。

    三、常用命令

    3.1 命令 evn

    env 显示当前用户的环境变量。

    [root@ryan ~]# env
    HOSTNAME=ryan
    SELINUX_ROLE_REQUESTED=
    TERM=xterm
    SHELL=/bin/bash
    HISTSIZE=1000
    SSH_CLIENT=192.168.1.102 57190 22
    SELINUX_USE_CURRENT_RANGE=
    SSH_TTY=/dev/pts/1
    USER=root
    ……

    3.2 命令 set

    set 显示当前 shell 的变量,包括当前用户的变量,系统预设的变量和用户自定义的变量。

    [root@ryan ~]# set
    BASH=/bin/bash
    BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
    BASH_ALIASES=()
    BASH_ARGC=()
    BASH_ARGV=()
    BASH_CMDS=()
    BASH_LINENO=()
    BASH_SOURCE=()
    BASH_VERSINFO=([0]="4" [1]="1" [2]="2" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")
    BASH_VERSION='4.1.2(1)-release'
    COLORS=/etc/DIR_COLORS
    COLUMNS=80
    ……

    每个 shell 都有自己特有的变量,这和用户变量是不同的。当前用户变量和你用什么 shell 无关,不管你用什么 shell 都是存在的,比如 HOME,SHELL 等这些变量。但 shell 自己的变量,不同的 shell 是不同的,比如 BASH_ARGC, BASH 等,这些变量只有 set 才会显示,是 bash 特有的。

    在父 shell 中设定变量后,进入子 shell 时,该变量不会继续生效,如果想让该变量在子 shell 中也生效,需要使用 export 指令,如下:

    只在当前 shell 中生效:

    [root@ryan linux]# myname=ryan
    [root@ryan linux]# echo $myname
    ryan
    [root@ryan linux]# bash
    [root@ryan linux]# echo $myname

    [root@ryan linux]# exit
    exit
    [root@ryan linux]# echo $myname
    ryan
    [root@ryan linux]# echo ${myname}
    ryan

    使用 export 声明后,在其子 shell 中也生效:
    [root@ryan linux]# export myname
    [root@ryan linux]# echo $myname
    ryan
    [root@ryan linux]# bash
    [root@ryan linux]# echo $myname
    ryan

    如果要想取消某个变量,可是使用 unset 变量名 即可,如下:

    [root@ryan linux]# echo $myname
    ryan
    [root@ryan linux]# unset myname
    [root@ryan linux]# echo $myname

    但是对于上面定义变量的方式,要么只能在当前 shell 中生效,要么是只能在当前 Shell 及其子 Shell 中生效,如果要让设置设置的变量一直生效,需要将其配置到文件中,可以如下分为两种情况。

    在自定义变量时,需要注意:

    变量名只能由字母、数字以及下环线组成,而且不能以数字开头,等号两边不能有空格。

    3.3 系统环境变量和个人环境变量的配置文件

    系统环境变量的配置文件:/etc/profile,在该文件中定义的变量,运行允许系统内所有用户登录后都能使用该变量。比如可以配置 Java 环境变量到该文件中:

    export JAVA_HOME=/usr/local/jdk1.8.0_144
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    export PATH=$JAVA_HOME/bin:$PATH

    配置之后,使用命令 source /etc/profile 即可立即生效。

    注意:

    Windows 中环境变量的值之间使用英文分号(;)作为分隔符,而 Linux 中使用英文冒号(:)作为分隔符。

    个人环境变量的配置文件:用户家目录下的 .bashrc,仅允许当前用户使用该变量,配置方式与上面一样,使用 source .bashrc,更改后立即生效。

    3.4 命令 alias

    alias,可以给一个常用但很长的命令取一个简单的别名,使用时,可以直接使用新的别名,但是该命令只对当前 shell 有效,如果需要一直生效,需要按照如上方式配置配置到文件中。如下:

    [root@ryan linux]# alias la='ls -alt --color=auto'
    [root@ryan linux]# la
    total 80
    drwxr-xr-x. 5 root root 4096 Mar 31 13:38 .
    -rw-r--r--. 1 root root 7 Mar 31 13:38 test1.txt
    dr-xr-x---. 22 root root 4096 Mar 29 22:12 ..
    -rw-r--r--. 1 root root 208 Mar 21 22:24 test1.tar.xz

    也可以使用: unalias 别名,来取消该别名,如下:

    [root@ryan linux]# unalias la
    [root@ryan linux]# la
    bash: la: command not found

    3.5 命令 cut

    cut - remove sections from each line of files,用来截取某个字段,其格式为:cut -d '分隔符' [cf] n,n 为数字,选项说明如下:

    -d:后面跟分隔符,且需要用单引号括起来;

    -c:后面接的是第几个字符;

    -f:后面接的是第几个区块;

    使用 vi 添加一些数据,如下:

    [root@ryan linux]# cat test2
    bob:26:shanxi:138912
    ryan:28:china:23124
    adam:30:xinjiang:123123
    emily:20:beijing:35345

    [root@ryan linux]# cat test2|cut -d ':' -f 1
    bob
    ryan
    adam
    emily

    -d 选项后面加冒号作为分隔符,-f 1 表示截取第一段,-f 和 1 之间的空格可有可无。

    [root@ryan linux]# cat test2|cut -c1
    b
    r
    a
    e

    -c 选项后面可以是一个数字 n,也可以是一个区间 n1-n2,也可以是多个数字 n1,n2,n3,如下:

    [root@ryan linux]# cat test2|cut -c1-6
    bob:26
    ryan:2
    adam:3
    emily:
    [root@ryan linux]# cat test2|cut -c1,3,4
    bb:
    ran
    aam
    eil

    cut 用的比较多的功能就是上面的按分隔符拆分然后获取,如下:

    [root@ryan shelltest]# ll
    total 32
    -rwxr-xr-x 1 root root 233 Apr 14 17:33 casetest.sh
    -rw-r--r-- 1 root root 18 Apr 13 20:49 field.properties
    -rwxr-xr-x 1 root root 141 Apr 14 17:40 fortest.sh
    -rwxr-xr-x 1 root root 211 Apr 13 20:48 funcomp.sh
    -rwxr-xr-x 1 root root 235 Apr 13 20:47 funtest.sh
    -rwxr-xr-x 1 root root 321 Apr 13 20:46 iftest.sh
    -rwxr-xr-x 1 root root 101 Apr 14 14:37 readtest.sh
    -rwxr-xr-x 1 root root 113 Apr 13 20:46 whiletest.sh
    [root@ryan shelltest]# cat field.properties
    appname=usrsystem
    [root@ryan shelltest]# appfile=field.properties
    [root@ryan shelltest]# appname=$(grep '^app' $appfile | cut -d '=' -f2)
    [root@ryan shelltest]# echo $appname
    usrsystem

    当然,也可以使用 awk 来实现分隔取值的功能,如下:

    [root@ryan shelltest]# appfile=field.properties
    [root@ryan shelltest]# appname=$(awk '/^app/' $appfile | awk -F '=' '{print $2}')
    [root@ryan shelltest]# echo $appname
    usrsystem

    注意:awk 以空格为分割域时,是以单个或多个连续的空格为分隔符的;cut 则是以单个空格作为分隔符。

    3.6 命令 sort

    sort - sort lines of text files,用于排序,格式为:sort [-t 分隔符] [-kn1,n2] [-nru],这里 n1 和 n2 都是数字,选项说明如下:

    -t:后面跟分隔符,作于和 cut 的 -d 选项一样;

    -n:表示使用纯数字排序;

    -r:表示反向排序;

    -u:表示去重复;

    -kn1,n2:表示由 n1 区间排序到 n2 区间,可以只写 -kn1,即对 n1 排序;

    如果 sort 不加任何选项,则按照从首字符向后依次按 ASCII 码值进行比较,最后将他们按升序输出,如下:

    [root@ryan linux]# cat test2
    bob:26:shanxi:138912
    ryan:28:china:23124
    adam:30:xinjiang:123123
    emily:20:beijing:35345

    -t 选项后面跟分隔符,-k 选项后面跟单个数字表示对第几个区域的字符串排序,-n 选项则表示使用纯数字排序,如下:

    [root@ryan linux]# sort -t: -k2 -n test2
    emily:20:beijing:35345
    bob:26:shanxi:138912
    ryan:28:china:23124
    adam:30:xinjiang:123123

    -k 选项后面跟数字 n1 和 n2 表示对第 n1 到 n2 区域内的字符串排序,-r 选项表示反向排序,即降序,如下:

    [root@ryan linux]# sort -t: -k2,4 -n -r test2
    adam:30:xinjiang:123123
    ryan:28:china:23124
    bob:26:shanxi:138912
    emily:20:beijing:35345

    3.7 命令 wc

    wc - print newline, word, character, and byte counts for each file,用于统计文档的行数,词数,字符数和比特数。常用的选项如下:

    -l:统计行数;

    -w:统计词数;

    -m:统计字符数;

    [root@ryan linux]# cat test2
    bob:26:shanxi:138912
    ryan:28:china:23124
    adam:30:xinjiang:123123
    emily:20:beijing:35345
    [root@ryan linux]# wc test2
    4 4 88 test2
    [root@ryan linux]# wc -l test2
    4 test2
    [root@ryan linux]# wc -w test2
    4 test2
    [root@ryan linux]# wc -m test2
    88 test2

    wc 后面不添加选项时,则会依次输出行数、词数和字符数。

    3.8 命令 uniq

    uniq - report or omit repeated lines,用来删除重复行。常用 -c 选项,表示统计出重复的行数,并把行数输出到前。

    先创建数据:

    [root@ryan linux]# cat test3.txt
    111222
    aabc
    aabc
    aabc
    aabcd
    111222
    abc123

    但是,使用 uniq 前,需要先给文件排序,然后才能使用 uniq 去重,否则显示的重复行数可能有误。原因在于:

    Note:  ’uniq’  does not detect repeated lines unless they are adjacent.  You may want to sort the input first, or use ‘sort -u’ without ‘uniq’.  Also, com-parisons honor the rules specified by ‘LC_COLLATE’.

    如下:

    [root@ryan linux]# uniq test3.txt
    111222
    aabc
    aabcd
    111222
    abc123
    [root@ryan linux]# sort test3.txt |uniq
    111222
    aabc
    aabcd
    abc123
    [root@ryan linux]# sort test3.txt |uniq -c
    2 111222
    3 aabc
    1 aabcd
    1 abc123

    当然也可以使用 sort -u(--unique) 来对文件去重,如下:

    [root@ryan linux]# sort -u test3.txt
    111222
    aabc
    aabcd
    abc123

    3.9 命令 tee

    tee - read from standard input and write to standard output and files,读取标准输入到标准输出和文件。也就是说 tee 既可以将数据显示在屏幕上,也同时将数据写入到文件中。常用的选项为 -a(--append),表示追加,不加该选项则表示覆盖。

    [root@ryan linux]# echo 'java softeware' |tee /tmp/tee.log
    java softeware
    [root@ryan linux]# cat /tmp/tee.log
    java softeware

    经常在编译源码包时会使用到如下命令:

    make 2>&1 | tee log.txt

    表示将标准错误信息重定向到 log.txt,同时也输出到屏幕。

    [root@ryan linux]# vi test.sh
    #!/bin/bash
    t
    date

    以上使用 vi 创建了 test.sh 脚本,添加执行权限,如下:

    [root@ryan linux]# ./test.sh
    bash: ./test.sh: Permission denied
    [root@ryan linux]# chmod +x test.sh

    然后执行 shell 脚本,如下:

    [root@ryan linux]# ./test.sh |tee /tmp/tee.log
    ./test.sh: line 2: t: command not found
    Sat Mar 31 19:04:47 CST 2018
    [root@ryan linux]# cat /tmp/tee.log
    Sat Mar 31 19:04:47 CST 2018
    [root@ryan linux]# ./test.sh 2>&1 |tee /tmp/tee.log
    ./test.sh: line 2: t: command not found
    Sat Mar 31 19:06:23 CST 2018
    [root@ryan linux]# cat /tmp/tee.log
    ./test.sh: line 2: t: command not found
    Sat Mar 31 19:06:23 CST 2018

    3.10 命令 tr

    tr - translate or delete characters,对来自标准输入的字符进行转换、删除或替换。通常用来删除文档中出现的特殊字符,如换行符等。常用命令如下:

    -d:表示删除某个字符,后面跟要删除的字符;

    -s:表示删除重复的字符;

    比如将小写字母转换成大写字母,如下:

    [root@ryan linux]# cat test3.txt
    111222
    aabc
    aabc
    aabc
    aabcd
    111222
    abc123
    [root@ryan linux]# cat test3.txt|tr '[a-z]' '[A-Z]'
    111222
    AABC
    AABC
    AABC
    AABCD
    111222
    ABC123

    也可以替换某个字符,如下:

    [root@ryan linux]# cat test3.txt
    111222
    aabc
    aabc
    aabc
    aabcd
    111222
    abc123
    [root@ryan linux]# cat test3.txt|tr 'a' 'A'
    111222
    AAbc
    AAbc
    AAbc
    AAbcd
    111222
    Abc123

    3.11 命令 split

    split - split a file into pieces,用于切割文档,常用选项有 -b 和 -l,如下:

    -b:表示依据大小来切割文档,单位为 byte;

    [root@ryan split_dir]# ll
    total 16
    -rw-r--r--. 1 root root 13368 Mar 31 19:49 install.log
    [root@ryan split_dir]# split -b 5k install.log
    [root@ryan split_dir]# ll
    total 36
    -rw-r--r--. 1 root root 13368 Mar 31 19:49 install.log
    -rw-r--r--. 1 root root 5120 Mar 31 19:51 xaa
    -rw-r--r--. 1 root root 5120 Mar 31 19:51 xab
    -rw-r--r--. 1 root root 3128 Mar 31 19:51 xac

    如果不指定 split 的目标文件名,则会以 xaa、xab... 这样的文件名来存取切割后的文件,我们也可以自定义目标文件名,目标文件名将会替换掉前面的 x,如下:

    [root@ryan split_dir]# rm -rf xa*
    [root@ryan split_dir]# ll
    total 16
    -rw-r--r--. 1 root root 13368 Mar 31 19:49 install.log
    [root@ryan split_dir]# split -b 5k install.log install
    [root@ryan split_dir]# ll
    total 36
    -rw-r--r--. 1 root root 5120 Mar 31 19:54 installaa
    -rw-r--r--. 1 root root 5120 Mar 31 19:54 installab
    -rw-r--r--. 1 root root 3128 Mar 31 19:54 installac
    -rw-r--r--. 1 root root 13368 Mar 31 19:49 install.log

    -l:表示依据行数来分割文档;

    [root@ryan split_dir]# wc -l install.log
    342 install.log
    [root@ryan split_dir]# split -l 100 install.log
    [root@ryan split_dir]# ll
    total 32
    -rw-r--r--. 1 root root 13368 Mar 31 19:49 install.log
    -rw-r--r--. 1 root root 3769 Mar 31 20:03 xaa
    -rw-r--r--. 1 root root 3742 Mar 31 20:03 xab
    -rw-r--r--. 1 root root 3981 Mar 31 20:03 xac
    -rw-r--r--. 1 root root 1876 Mar 31 20:03 xad
    [root@ryan split_dir]# wc -l *
    342 install.log
    100 xaa
    100 xab
    100 xac
    42 xad
    684 total

    3.12 命令 paste

    paste - merge lines of files,合并文件行,默认使用制表位(TABs)分隔,也可自定义合并后的分隔符。通常用于将两个含有单列数据的文件,按行合并到同一个文件中。选项 -d 后面跟自定义的分隔符

    [root@ryan linux]# cat vim 11.txt
    cat: vim: No such file or directory
    1
    2
    3
    4
    5
    [root@ryan linux]# cat 11.txt
    1
    2
    3
    4
    5
    [root@ryan linux]# cat 22.txt
    q
    w
    e
    r
    t
    y
    [root@ryan linux]# paste 11.txt 22.txt
    1 q
    2 w
    3 e
    4 r
    5 t
    y
    [root@ryan linux]# paste -d',' 11.txt 22.txt
    1,q
    2,w
    3,e
    4,r
    5,t
    ,y

    四、特殊符号

    4.1 特殊符号 $

    符号 $ 可以作为标识符放在变量前,表示引用这个变量;也可以与英文感叹号 ! 结合起来使用,表示上一条命令的最后一个变量,如下:

    [root@ryan split_dir]# wc -l install.log
    342 install.log
    [root@ryan split_dir]# ll !$
    ll install.log
    -rw-r--r--. 1 root root 13368 Mar 31 19:49 install.log

    4.2 特殊符号 ;

    我们通常都是在一行输入一条命令,然后回车执行。也可以在一行输入多条命令,中间添加分隔符(;)即可,如下:

    [root@ryan linux]# ll test1.txt;cat test3.txt
    -rw-r--r--. 1 root root 7 Mar 31 13:38 test1.txt
    111222
    aabc
    aabc
    aabc
    aabcd
    111222
    abc123

    4.3 特殊符号 ~

    符号 ~ 代表家目录,root 的家目录是 /root,普通用户的家目录是 /home/username。

    4.4 特殊符号 &

    如果要将一条命令放入后台运行,可以添加符号 &,如:

    [root@ryan linux]# vmstat 1 >/tmp/vm.log &
    [1] 2576

    4.5 特殊符号 >、>>

    符号 > 和 >> 都是重定向符,分别表示覆盖和追加的意思,2> 和 2>> 分别表示将标准错误信息的覆盖和追加。

    Linux 中有三种标准输入输出,分别是 STDIN,STDOUT,STDERR,对应的数字是 0,1,2。STDIN 是标准输入,默认从键盘读取信息;STDOUT 是标准输出,默认将输出结果输出至终端;STDERR 是标准错误,默认将输出结果输出至终端。

    4.6 特殊符号 && 和 ||

    前面提到的多条命令之间的分号(;),command1;command2,不管command1 是否执行成功,command2 仍然会继续执行;

    command1 && command2,只有 command1 执行成功后,command2 才会执行,否则 command2 不会执行;

    command1 || command2,只要 command1 执行成功,command2 就不执行,否则 command2 执行。

    符号 &&、|| 与 Java 等语言中的逻辑运算符的规则类似。

    4.7 常见的通配符

    * 代表零个或多个任意字符

    ? 只代表一个任意的字符

    [] 中括号为字符组合,代表字符组合中的任意一个

    [root@ryan linux]# ls -d *
    1 split_dir test1.tar.bz2 test1.txt test3.txt test.sh
    file.log test test1.tar.gz test1.zip test4
    install.log test1 test1.tar.xz test2 test4.zip
    [root@ryan linux]# ls -d test*
    test test1.tar.bz2 test1.tar.xz test1.zip test3.txt test4.zip
    test1 test1.tar.gz test1.txt test2 test4 test.sh
    [root@ryan linux]# ls -d test?
    test1 test2 test4
    [root@ryan linux]# ls -d test[2-4]
    test2 test4

  • 相关阅读:
    程序员如何判断是否到了该辞职的时候?
    牛客网
    C++继承详解:共有(public)继承,私有(private)继承,保护(protected)继承
    为什么构造函数不能声明为虚函数,析构函数可以
    为什么要线程同步,说出线程同步的几种方法
    内存字节对齐
    std::map的删除
    阻塞调用ShellExecute函数
    无法打开包括文件:“SDKDDKVer.h”: No such file or directory
    Legacy C++ MongoDB Driver
  • 原文地址:https://www.cnblogs.com/cnjavahome/p/8679105.html
Copyright © 2020-2023  润新知