Linux 语法杂记

  • install
    install -d /qq/aa #-d会创建从qq到aa之间的所有主目录,-d选项只能用来创建目录,不能复制。

    install -D aa.txt /qq/aa #-D不仅会创建从qq 到aa的所有主目录,还会把aa.txt文件复制到新创建的aa目录下

  • 2>&1
    把标准错误输出到标准输出,加&表示其是标准输出而不是文件1

  • &>file
    意思是把 标准输出 和 标准错误输出 都重定向到文件file中

  • /dev/null
    可以把不需要的输出重定向到这个文件。

  • set -e
    设置该选项后,当脚本中任何以一个命令执行返回的状态码不为0时就退出整个脚本

  • set -u
    设置该选项后,当脚本在执行过程中尝试使用未定义过的变量时,报错并退出运行整个脚本(默认会把该变量的值当作空来处理)
    用set +u来取消该选项。

  • trap

    第一种形式的trap命令在shell接收到signal list清单中数值相同的信号时,将执行双引号中的命令串。 trap
    ‘commands’ signal-list

    trap “commands” signal-list

    为了恢复信号的默认操作,使用第二种形式的trap命令:

    trap signal-list

    第三种形式的trap命令允许忽视信号

    trap " " signal-list

  • $

    (1)$ $ Shell本身的PID(ProcessID,即脚本运行的当前进程ID号)
    (2)$ ! Shell最后运行的后台Process的PID(后台运行的最后一个进程的进程ID号)
    (3)$ ? 最后运行的命令的结束代码(返回值)即执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
    (4)$ - 显示shell使用的当前选项,与set命令功能相同
    (5)$ * 所有参数列表。如"$ *“用「”」括起来的情况、以"$ 1 $ 2 … $ n"的形式输出所有参数,此选项参数可超过9个。
    (6)$ @ 所有参数列表。如"$ @“用「”」括起来的情况、以"$ 1" “$ 2” … “$ n” 的形式输出所有参数。
    (7)$ * 跟$ @类似,但是可以当作数组用
    (8)$ # 添加到Shell的参数个数
    (9)$ 0 Shell本身的文件名
    (10)$ 1~$ n添加到Shell的各参数值。$1是第1参数、$2是第2参数…

  • getopts

    while getopts :ab:c: OPTION;do              #ab参数前面的:表示忽略错误
        case $OPTION in
          a)echo "get option a"
          ;;
          b)echo "get option b and parameter is $OPTARG"
          ;;
          c)echo "get option c and parameter is $OPTARG"
          ;;
          ?)echo "get a non option $OPTARG and OPTION is $OPTION"
          ;;
        esac
    done
    

    getopts 适用于脚本参数很多的情况, 上面例子中a 相当于-a 的参数 b: 相当于 -b value的参数。$OPTARG 是参数名加参数值。

  • 双引号和$
    $的优先级大于双引号,只要双引号中出现了$, 先计算$的值

  • tee
    tee 可以把标准输入输出到文件中,同时还能保留屏幕输出。
    使用指令"tee"将用户输入的数据同时保存到文件"file1"和"file2"中,输入如下命令:

    $ tee file1 file2                  
    
  • tail
    tail [参数] [文件] 按参数显示文件内容
    -f 循环读取
    -c<数目> 显示的字节数
    -n<行数> 显示文件的尾部 n 行内容

    如果没有指定文件,则会使用标准输入

  • if

    if [ command ]; then
         符合该条件执行的语句
    fi
    

    只有command返回状态为0才能执行then后面的语句
    对于if ps uax| grep root | grep van
    这样一条语句,command的返回值只跟第二个grep有关。

  • sed
    sed ‘/123|abc/!d’ 1.txt #删除不匹配123或abc的行,/123|abc/ 表示匹配123或abc ,!表示取反
    sed ‘s/123/hello/’ 1.txt #将文件中的123替换为hello,默认只替换每行第一个123
    sed ‘s/123/hello/g’ 1.txt #将文本中所有的123都替换为hello

  • test
    test -eq 等于则为真

    if test $[num1] -eq $[num2]
    

    test -e 文件名 如果文件存在则为真

打包

压缩指令只能对一个文件进行压缩,而打包能够将多个文件打包成一个大文件。tar 不仅可以用于打包,也可以使用 gzip、bzip2、xz 将打包文件进行压缩。

$ tar [-z|-j|-J] [cv] [-f 新建的 tar 文件] filename...  ==打包压缩
$ tar [-z|-j|-J] [tv] [-f 已有的 tar 文件]              ==查看
$ tar [-z|-j|-J] [xv] [-f 已有的 tar 文件] [-C 目录]    ==解压缩
-z :使用 zip;
-j :使用 bzip2;
-J :使用 xz;
-c :新建打包文件;
-t :查看打包文件里面有哪些文件;
-x :解打包或解压缩的功能;
-v :在压缩/解压缩的过程中,显示正在处理的文件名;
-f : filename:要处理的文件;
-C 目录 : 在特定目录解压缩。
使用方式 命令
打包压缩 tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称
查 看 tar -jtv -f filename.tar.bz2
解压缩 tar -jxv -f filename.tar.bz2 -C 要解压缩的目录

七、Bash

可以通过 Shell 请求内核提供服务,Bash 正是 Shell 的一种。

特性

  • 命令历史:记录使用过的命令
  • 命令与文件补全:快捷键:tab
  • 命名别名:例如 ll 是 ls -al 的别名
  • shell scripts
  • 通配符:例如 ls -l /usr/bin/X* 列出 /usr/bin 下面所有以 X 开头的文件

变量操作

对一个变量赋值直接使用 =。

对变量取用需要在变量前加上 $ ,也可以用 ${} 的形式;

输出变量使用 echo 命令。

$ x=abc
$ echo $x
$ echo ${x}

变量内容如果有空格,必须使用双引号或者单引号。

  • 双引号内的特殊字符可以保留原本特性,例如 x=“lang is $LANG”,则 x 的值为 lang is zh_TW.UTF-8;
  • 单引号内的特殊字符就是特殊字符本身,例如 x=‘lang is $LANG’,则 x 的值为 lang is $LANG。

可以使用 `指令` 或者 $(指令) 的方式将指令的执行结果赋值给变量。例如 version=$(uname -r),则 version 的值为 4.15.0-22-generic。

可以使用 export 命令将自定义变量转成环境变量,环境变量可以在子程序中使用,所谓子程序就是由当前 Bash 而产生的子 Bash。

Bash 的变量可以声明为数组和整数数字。注意数字类型没有浮点数。如果不进行声明,默认是字符串类型。变量的声明使用 declare 命令:

$ declare [-aixr] variable
-a : 定义为数组类型
-i : 定义为整数类型
-x : 定义为环境变量
-r : 定义为 readonly 类型

使用 [ ] 来对数组进行索引操作:

$ array[1]=a
$ array[2]=b
$ echo ${array[1]}

指令搜索顺序

  • 以绝对或相对路径来执行指令,例如 /bin/ls 或者 ./ls ;
  • 由别名找到该指令来执行;
  • 由 Bash 内置的指令来执行;
  • 按 $PATH 变量指定的搜索路径的顺序找到第一个指令来执行。

数据流重定向

重定向指的是使用文件代替标准输入、标准输出和标准错误输出。

1 代码 运算符
标准输入 (stdin) 0 < 或 <<
标准输出 (stdout) 1 > 或 >>
标准错误输出 (stderr) 2 2> 或 2>>

其中,有一个箭头的表示以覆盖的方式重定向,而有两个箭头的表示以追加的方式重定向。

可以将不需要的标准输出以及标准错误输出重定向到 /dev/null,相当于扔进垃圾箱。

如果需要将标准输出以及标准错误输出同时重定向到一个文件,需要将某个输出转换为另一个输出,例如 2>&1 表示将标准错误输出转换为标准输出。

$ find /home -name .bashrc > list 2>&1

八、管道指令

管道是将一个命令的标准输出作为另一个命令的标准输入,在数据需要经过多个步骤的处理之后才能得到我们想要的内容时就可以使用管道。

在命令之间使用 | 分隔各个管道命令。

$ ls -al /etc | less

提取指令

cut 对数据进行切分,取出想要的部分。

切分过程一行一行地进行。

$ cut
-d :分隔符
-f :经过 -d 分隔后,使用 -f n 取出第 n 个区间
-c :以字符为单位取出区间

示例 1:last 显示登入者的信息,取出用户名。

$ last
root pts/1 192.168.201.101 Sat Feb 7 12:35 still logged in
root pts/1 192.168.201.101 Fri Feb 6 12:13 - 18:46 (06:33)
root pts/1 192.168.201.254 Thu Feb 5 22:37 - 23:53 (01:16)

$ last | cut -d ' ' -f 1

示例 2:将 export 输出的信息,取出第 12 字符以后的所有字符串。

$ export
declare -x HISTCONTROL="ignoredups"
declare -x HISTSIZE="1000"
declare -x HOME="/home/dmtsai"
declare -x HOSTNAME="study.centos.vbird"
.....(其他省略).....

$ export | cut -c 12-

排序指令

sort 用于排序。

$ sort [-fbMnrtuk] [file or stdin]
-f :忽略大小写
-b :忽略最前面的空格
-M :以月份的名字来排序,例如 JAN,DEC
-n :使用数字
-r :反向排序
-u :相当于 unique,重复的内容只出现一次
-t :分隔符,默认为 tab
-k :指定排序的区间

示例:/etc/passwd 文件内容以 : 来分隔,要求以第三列进行排序。

$ cat /etc/passwd | sort -t ':' -k 3
root:x:0:0:root:/root:/bin/bash
dmtsai:x:1000:1000:dmtsai:/home/dmtsai:/bin/bash
alex:x:1001:1002::/home/alex:/bin/bash
arod:x:1002:1003::/home/arod:/bin/bash

uniq 可以将重复的数据只取一个。

$ uniq [-ic]
-i :忽略大小写
-c :进行计数

示例:取得每个人的登录总次数

$ last | cut -d ' ' -f 1 | sort | uniq -c
1
6 (unknown
47 dmtsai
4 reboot
7 root
1 wtmp

双向输出重定向

输出重定向会将输出内容重定向到文件中,而 tee 不仅能够完成这个功能,还能保留屏幕上的输出。也就是说,使用 tee 指令,一个输出会同时传送到文件和屏幕上。

$ tee [-a] file

字符转换指令

tr 用来删除一行中的字符,或者对字符进行替换。

$ tr [-ds] SET1 ...
-d : 删除行中 SET1 这个字符串

示例,将 last 输出的信息所有小写转换为大写。

$ last | tr '[a-z]' '[A-Z]'

col 将 tab 字符转为空格字符。

$ col [-xb]
-x : 将 tab 键转换成对等的空格键

expand 将 tab 转换一定数量的空格,默认是 8 个。

$ expand [-t] file
-t :tab 转为空格的数量

join 将有相同数据的那一行合并在一起。

$ join [-ti12] file1 file2
-t :分隔符,默认为空格
-i :忽略大小写的差异
-1 :第一个文件所用的比较字段
-2 :第二个文件所用的比较字段

paste 直接将两行粘贴在一起。

$ paste [-d] file1 file2
-d :分隔符,默认为 tab

分区指令

split 将一个文件划分成多个文件。

$ split [-bl] file PREFIX
-b :以大小来进行分区,可加单位,例如 b, k, m 等
-l :以行数来进行分区。
- PREFIX :分区文件的前导名称

九、正则表达式

grep

g/re/p(globally search a regular expression and print),使用正则表示式进行全局查找并打印。

$ grep [-acinv] [--color=auto] 搜寻字符串 filename
-c : 统计匹配到行的个数
-i : 忽略大小写
-n : 输出行号
-v : 反向选择,也就是显示出没有 搜寻字符串 内容的那一行
--color=auto :找到的关键字加颜色显示

示例:把含有 the 字符串的行提取出来(注意默认会有 --color=auto 选项,因此以下内容在 Linux 中有颜色显示 the 字符串)

$ grep -n 'the' regular_express.txt
8:I can't finish the test.
12:the symbol '*' is represented as start.
15:You are the best is mean you are the no. 1.
16:The world Happy is the same with "glad".
18:google is the best tools for search keyword

示例:正则表达式 a{m,n} 用来匹配字符 a m~n 次,这里需要将 { 和 } 进行转义,因为它们在 shell 是有特殊意义的。

$ grep -n 'a\{2,5\}' regular_express.txt

用-E来实现or 操作

if [ `grep aaa b.txt >/dev/null` ]; then

取决于grep命令的结果,重定向操作是没有返回结果的。
-E 用来实现or操作

 grep -E ‘pattern1|pattern2’ filename

printf

用于格式化输出。它不属于管道命令,在给 printf 传数据时需要使用 $( ) 形式。

$ printf '%10s %5i %5i %5i %8.2f \n' $(cat printf.txt)
    DmTsai    80    60    92    77.33
     VBird    75    55    80    70.00
       Ken    60    90    70    73.33

awk

是由 Alfred Aho,Peter Weinberger 和 Brian Kernighan 创造,awk 这个名字就是这三个创始人名字的首字母。

awk 每次处理一行,处理的最小单位是字段,每个字段的命名方式为:$n,n 为字段号,从 1 开始,$0 表示一整行。

示例:取出最近五个登录用户的用户名和 IP。首先用 last -n 5 取出用最近五个登录用户的所有信息,可以看到用户名和 IP 分别在第 1 列和第 3 列,我们用 $1 和 $3 就能取出这两个字段,然后用 print 进行打印。

$ last -n 5
dmtsai pts/0 192.168.1.100 Tue Jul 14 17:32 still logged in
dmtsai pts/0 192.168.1.100 Thu Jul 9 23:36 - 02:58 (03:22)
dmtsai pts/0 192.168.1.100 Thu Jul 9 17:23 - 23:36 (06:12)
dmtsai pts/0 192.168.1.100 Thu Jul 9 08:02 - 08:17 (00:14)
dmtsai tty1 Fri May 29 11:55 - 12:11 (00:15)
$ last -n 5 | awk '{print $1 "\t" $3}'
dmtsai   192.168.1.100
dmtsai   192.168.1.100
dmtsai   192.168.1.100
dmtsai   192.168.1.100
dmtsai   Fri

可以根据字段的某些条件进行匹配,例如匹配字段小于某个值的那一行数据。

$ awk '条件类型 1 {动作 1} 条件类型 2 {动作 2} ...' filename

示例:/etc/passwd 文件第三个字段为 UID,对 UID 小于 10 的数据进行处理。

$ cat /etc/passwd | awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t " $3}'
root 0
bin 1
daemon 2

awk 变量:

变量名称 代表意义
NF 每一行拥有的字段总数
NR 目前所处理的是第几行数据
FS 目前的分隔字符,默认是空格键

示例:显示正在处理的行号以及每一行有多少字段

$ last -n 5 | awk '{print $1 "\t lines: " NR "\t columns: " NF}'
dmtsai lines: 1 columns: 10
dmtsai lines: 2 columns: 10
dmtsai lines: 3 columns: 10
dmtsai lines: 4 columns: 10
dmtsai lines: 5 columns: 9

十、进程管理

查看进程

1. ps

查看某个时间点的进程信息。

示例:查看自己的进程

## ps -l

示例:查看系统所有进程

## ps aux

示例:查看特定的进程

## ps aux | grep threadx

2. pstree

查看进程树。

示例:查看所有进程树

## pstree -A

3. top

实时显示进程信息。

示例:两秒钟刷新一次

## top -d 2

4. netstat

查看占用端口的进程

示例:查看特定端口的进程

## netstat -anp | grep port

猜你喜欢

转载自blog.csdn.net/weixin_39849839/article/details/108074355