Linux学习笔记

  1. 1. 文件系统和挂载点
  2. 2. vim操作
    1. 2.1. 一般模式
    2. 2.2. 编辑模式/插入模式
    3. 2.3. 命令模式
  3. 3. 网络相关
    1. 3.1. 连接模式
    2. 3.2. 配置服务器
  4. 4. 远程登录
  5. 5. 系统服务
    1. 5.1. 运行级别
    2. 5.2. 关机
  6. 6. 常用命令
    1. 6.1. 帮助命令
    2. 6.2. 文件目录
    3. 6.3. 时间日期
    4. 6.4. 用户及权限
      1. 6.4.1. 用户
      2. 6.4.2. 权限
        1. 6.4.2.1. 权限详解
        2. 6.4.2.2. 权限修改
    5. 6.5. 查找命令
    6. 6.6. 压缩和解压
    7. 6.7. 磁盘
    8. 6.8. 进程管理
  7. 7. Shell编程
    1. 7.1. hello,world
    2. 7.2. 变量
      1. 7.2.1. 特殊变量
      2. 7.2.2. 运算符
    3. 7.3. 流程控制
      1. 7.3.1. if判断
      2. 7.3.2. 循环
        1. 7.3.2.1. for循环
        2. 7.3.2.2. while循环
    4. 7.4. 条件判断
      1. 7.4.1. 常用判断语句
    5. 7.5. 读取控制台输入
    6. 7.6. 函数
      1. 7.6.1. 系统函数
      2. 7.6.2. 自定义函数
    7. 7.7. 正则表达式
      1. 7.7.1. 常规匹配
      2. 7.7.2. 常用特殊字符
        1. 7.7.2.1. ^string
        2. 7.7.2.2. string$
        3. 7.7.2.3. .
        4. 7.7.2.4. S*
    8. 7.8. 文本处理工具
      1. 7.8.1. cut
      2. 7.8.2. awk

文件系统和挂载点

Linux的文件系统是树形目录结构,与windows分为C,D,E盘,每个盘都是一个树不同,Linux只有一棵树,也只有一个根节点'/',其余目录都是该节点的子节点。

所以,Linux在分区的时候,会把分区对应到一个目录上,例如/home对应分区1,那么分区1的挂载点就是home目录,可以说一个文件夹就代表了一个分区

vim操作

vim编辑器有三种模式:一般模式,编辑模式,命令模式。

默认进入一般模式,在该模式下可以进行复制,黏贴,删除操作;

编辑模式下可以对打开的文件进行编辑;

命令模式用于执行一些命令;

在一般模式下,按i可进入编辑模式,按下:可进入命令默认,从编辑和命令模式按esc可进入一般模式;

一般模式

  • 单词:w

    按下b,跳到当前光标所在单词的上一个单词;

    按下w,可以从当前单词跳到下一个单词

    yw:可以从光标当前位置一直复制到下一个不是字母的位置

    dw:可以从光标当前位置一直删除到下一个不是字母的位置

  • 复制:yy

    连续按下两次y,可以复制光标所在的当前行;

    在复制操作前按下数字,比如3,可以复制包括当前行在内的3行;

    y$:可以复制从光标开始,到当前行结尾内容;

    y^:可以复制从当前行开头开始,到光标前为结尾的内容;

  • 黏贴:p

    按下p会把复制的内容黏贴到当前光标所在的位置;

    在按p前按下数字,表示重复几次黏贴操作;

  • 删除:dd

    按下dd,会删除当前光标所在行;

    dd前按下数字,会删除包括当前行在内的多行内容;

  • 撤销:u

    按下字母u,会撤销上一步操作;

  • 单个字符操作:

    x:会剪切当前光标的字符;

    r:代表要求修改当前光标的字符;

  • 其它

    按下gg/H,返回文档的开始位置;

    按下G,移动到文档的末尾;

    跳转到指定行:数字+G

编辑模式/插入模式

按下i(a,o,I,A,O)进入,esc退出

命令模式

按下进入,按下esc退出;

  • :w:保存

  • :q:退出

  • :!:强制执行

  • 可以组合使用::wq:q!

  • :set nu:设置行号,:set nonu

  • 字符串操作:

    查找:/tar;

    替换:

    • s/old/new
    • s/old/new/g
    • %/old/new
    • %/old/new/g
  • 取消高亮::noh

网络相关

连接模式

  • 桥接模式

    通过修改配置文件的方式:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //打开配置文件
    vim /etc/sysconfig/network-scripts/ifcfg-ens33
    BOOTPROTO="static"
    //静态ip地址
    IPADDR=192.168.204.100
    //子网掩码
    NETMASK=255.255.255.0
    //网关
    GATEWAY=192.168.204.2
    //域名解析
    DNS1=192.168.204.2
    DNS2=8.8.8.8
  • NAT模式

  • 仅主机模式

配置服务器

  1. 配置静态域名

    如上述;

  2. 设置主机名

    1
    2
    3
    vim etc/hostname
    liangxi100

  3. 把域名和主机名对应起来

    1
    2
    3
    vim etc/hosts
    //映射
    192.168.204.100 liangxi100
  4. 在hosts文件中注册

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    # Copyright (c) 1993-2009 Microsoft Corp.
    #
    # This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
    #
    # This file contains the mappings of IP addresses to host names. Each
    # entry should be kept on an individual line. The IP address should
    # be placed in the first column followed by the corresponding host name.
    # The IP address and the host name should be separated by at least one
    # space.
    #
    # Additionally, comments (such as these) may be inserted on individual
    # lines or following the machine name denoted by a '#' symbol.
    #
    # For example:
    #
    # 102.54.94.97 rhino.acme.com # source server
    # 38.25.63.10 x.acme.com # x client host

    # localhost name resolution is handled within DNS itself.
    #127.0.0.1 localhost
    #::1 localhost

    192.168.204.100 liangxi100

远程登录

1
2
3
4
5
6
7
8
9
10
11
12
C:\Users\Administrator>ssh root@liangxi100
The authenticity of host 'liangxi100 (192.168.204.100)' can't be established.
ECDSA key fingerprint is SHA256:VgqyVimrKsB7MT195OgNvy582bRQ005GkWV3qam9PeI.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'liangxi100,192.168.204.100' (ECDSA) to the list of known hosts.
root@liangxi100's password:
Last login: Mon Nov 28 16:22:24 2022
[root@liangxi100 ~]# ls
anaconda-ks.cfg initial-setup-ks.cfg 公共 模板 视频 图片 文档 下载 音乐 桌面
[root@liangxi100 ~]# exit
登出
Connection to liangxi100 closed.

远程登录工具:

Xshell,SSH Secure Shell,FInalShell等;

系统服务

1
2
3
4
//开启 关闭 状态 重启 服务
systemctl start | stop | status | restart 服务名
比如:
systemctl restart network

运行级别

在centos7下,运行级别由原来的7级简化为了两种:

  • multi-user.target:等价于原级别3,多用户有网,无图形界面;
  • graphical.target:等价于原级别5,多用户有网,有图形界面;

查看当前运行级别:

1
systemctl get-default

设置服务开机自启/关闭:

1
2
3
4
5
6
chkconfig 服务名 on/off
比如:
chkconfig network on
chkconfig network off

systemctl enable/disable 服务名

关机

1
2
3
4
5
6
7
8
shutdown #在1分钟后关机
shutdown 3 #在3分钟后关机
shutdown dd:ss #在什么时刻关机
shutdown now #立刻关机
shutdown -r now #重启,相当于reboot
shutdown -H #停机,相当于halt 不断电

sync #将内存数据同步

常用命令

帮助命令

1
2
3
4
5
man 命令:# 命令有两种,一种是外部命令,ls;一种是内置命令(放在bash中),cd,这两种有不同
man ls / ls --help
man -f cd / help cd

type 命令 # 判断命令类型
1
2
3
ctrl + c 结束当前进程

ctrl + l 相当于clear

文件目录

1
2
3
4
5
cd  / #绝对目录
cd ../ #相对目录
cd ./ #当前目录
cd - #返回上一次所在文件夹
pwd # 输出当前所在位置
1
2
3
4
ls   #列出当前目录的内容
ls -a #列出当前目录的所有内容
ls -l #列出内容的属性
ls -l -a #组合使用
1
2
3
4
5
6
7
8
# 目录操作
# 创建
mkdir 目录1 [目录2] [目录3] # 在当前目录下创建目录
mkdir /目录1 # 在/下创建目录
mkdir -p /目录1/目录2 # 创建多级目录,p:如果父目录没有创建,就创建父目录
# 移除
rmdir 目录1 [目录2] [目录3] # 删除当前目录下的目录
rmdir -p 目录1/目录2 # 如果目录1下有目录2,那么先删除目录2,在删除目录1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 文件操作
# 创建一个空文件
touch hello # 在当前目录下创建一个新文件,默认为文本文件
touch ./文档/hello2 # 在当前目录下的文档目录中创建一个新文件
# 复制操作 cp source dest source可以是文件或者目录,dest也是
cp hello ./文档/ #把hello复制到当前目录的文档目录下
cp hello ./文档/hello2 #用hello文件的内容覆盖hello2文件的内容
cp:是否覆盖"./文档/hello2"? y #如果不想显示提示,可用\cp,调用原生命令
cp -r 目录1 目录2 #把目录1复制到目录2下,包括目录1下的内容,-r 递归复制
cp -r ./文档/ /home/liangxi/
# 删除操作 可以删除文件或目录 rm -r(递归删除目录) -f(强制执行,不需提示) -v(显示执行过程)
rm hello
rm:是否删除普通空文件 "hello"?y

rm -v ./* # 删除当前目录下的所有文件,但是保留该目录
[root@liangxi100 文档]# rm -v ./*
rm:是否删除普通空文件 "./hello"?y
已删除"./hello"
rm:是否删除普通空文件 "./hello2"?y
已删除"./hello2"
# 查看文件 cat -n 文件名 -n:添加行号 一般用于查看小文件
cat -n anaconda-ks.cfg
more anaconda-ks.cfg
less anaconda-ks.cfg # 适合打开大型文本,比如小说

# 输出重定向 可以把要查看的内容放到一个文件在 > 添加 >>追加
history > code
history >> code
echo "hello word" >> code

# 显示文件的前n行
head 文件名 # 显示文件的一行
head -n 5 文件名 # 显示文件的前5行
# 显示文件的最后几行
tail 文件名
tail -n 5 文件名
tail -f 文件名 # 除显示文件的最后几行外,还可以监视文件的改变 ctrl +s暂停 f继续
1
2
3
4
# 软链接  相当于创建了一个链接文件,该链接文件存储了目标文件的地址  ln -s 源文件或者目录 链接名
ln -s /root/info myInfo #在当前目录下创建了一个名为myInfo的链接文件,指向了/root/info
# 硬链接 目录创建不了硬链接

1
2
3
4
5
# 查看历史命令
history
history n # 查看最近n个历史命令
history -c # 清楚历史记录
!number # 显示保存的第num条记录

时间日期

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# date 显示当前时间  2022年 11月 30日 星期三 14:35:37 CST
date +%Y
2022
date +%m
11
date +%d
30
[root@liangxi100 ~]# date +%s
1669790475
[root@liangxi100 ~]# date +%S
23
[root@liangxi100 ~]# date "+Y-%m-%d %H:%M:%S"
Y-11-30 14:38:09
[root@liangxi100 ~]# date "+%Y-%m-%d %H:%M:%S"
2022-11-30 14:38:24

# -d 显示之前或之后,单位可以改变
[root@liangxi100 ~]# date -d "1 hours ago"
2022年 11月 30日 星期三 13:43:47 CST
[root@liangxi100 ~]# date -d "-1 hours ago"
2022年 11月 30日 星期三 15:44:20 CST

# -s 设置系统时间
date -s "2017-06-19 10:10:10"
ntpdate #联网更新时间

# 日历
cal

用户及权限

用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 添加用户
useradd liangxi2
# 在添加用户的时候设置主目录
useradd -d /home/liangxi03 liangxi3
# 为用户添加密码
passwd liangxi3
# 查看用户信息
id root
# 跳转为其它用户
su liangxi
exit #退出当前会话,返回创建它的会话
# 查看我是谁
who am i # 查看根本信息
whoami # 查看当前信息

权限

1
2
3
4
5
6
7
8
9
# sudo 让普通用户临时拥有root权限
#首先,在配置文件中添加
vim /etc/sudoers
# 用户名,所有权限
liangxi ALL=(ALL) ALL
# 其次,转到该用户
su liangxi
#使用sudo执行命令
sudo ls
1
2
3
4
# 删除用户操作 userdel 用户 此方式不会删除该用户的主目录
userdel liangxi3
# 加 -r 参数,可以删除用户及其主目录
userdel -r liangxi2
1
2
3
4
5
6
7
8
9
10
11
# 每个用户都属于一个组,如果在创建用户的时候没有指定其所属组的话,将自动创建与用户名同名的组,将属于改组
# 创建一个组
groupadd 1a
# 修改用户所属组 usermod -g 组名 用户名
usermod -g la liangxi2
usermod -g la liangxi3
# 修改组名 groupmod -n newName oldName
groupmod -n 1A 1a
# 删除组
groupdel liangxi2
groupdel liangxi3

权限详解

使用 ls -l可以查看一个文件的全部属性

1
2
3
4
5
6
7
8
9
10
11
12
 ls -l
-rw-------. 1 root root 1888 11月 28 16:16 anaconda-ks.cfg
-rw-r--r--. 1 root root 3821 11月 30 14:10 info
-rw-r--r--. 1 root root 1919 11月 28 16:19 initial-setup-ks.cfg
drwxr-xr-x. 2 root root 6 11月 28 16:22 公共
drwxr-xr-x. 2 root root 6 11月 28 16:22 模板
drwxr-xr-x. 2 root root 6 11月 28 16:22 视频
drwxr-xr-x. 2 root root 6 11月 28 16:22 图片
drwxr-xr-x. 2 root root 6 11月 30 10:21 文档
drwxr-xr-x. 2 root root 6 11月 28 16:22 下载
drwxr-xr-x. 2 root root 6 11月 28 16:22 音乐
drwxr-xr-x. 2 root root 29 11月 29 09:13 桌面

drwxr-xr-x解释

  • 从左到右树,第一位 d,表示了该文件的属性,目录,此外,还有(-)普通文件,(b)块文件,(c)设备文件,(l)链接文件;
  • 2-4表示了属主(user)对该文件的权限,读,写,执行;
  • 5-7表示了user所属的组(group)对该文件的权限,读,写,执行;
  • 8-10表示了其它用户对该文件的权限,读,写,执行;

1

  • 硬链接的数量,当为0时,可以说被彻底删除

root root

  • 所属用户和组

权限修改

主要使用chmod命令 r = 4 w = 2 x = 1

chmod [xxx] [文件或目录]

chmod [ugoa][+-=] [rwx] [文件或目录] u = user g = group o = other a = all

1
2
3
4
5
6
7
8
9
10
 ls -l info
-rw-r--r--. 1 root root 3821 11月 30 14:10 info #最初权限
chmod g+w info
ls -l info
-rw-rw-r--. 1 root root 3821 11月 30 14:10 info #修改一下
chmod 644 info
ls -l info
-rw-r--r--. 1 root root 3821 11月 30 14:10 info #回到最初权限
# 当修改一个目录时,如果想让其所有内容的权限也进行修改
chmod -R xxx 目录名
1
2
3
4
# 修改所属用户
chown 用户 文件或目录 # -R 用法同上
# 修改所属组
chgrp 组名 文件或目录

查找命令

1
2
3
4
5
6
7
8
9
10
11
12
# find [范围] [选项]
find -name info
./.local/share/Trash/info
./info

# locate 定位文件 文件名和路径信息会被存放到一个数据库中,所以搜索速度非常快,但是(使用前)需要更新
updatedb #更新数据库
locate info # 找到所有包含info子串的内容
which ls #查看命令信息
whereis ls #查看命令在哪里

# grep 查找关键字 “|”管道,把前一个命令的结果传给后一个命令 wc 统计(行数,单词数,字符数)

压缩和解压

  • zip/unzip

    zip 压缩名 文件

    zip -r 压缩目录

    unzip -d 目录 文件

  • tar

    -c

    -v

    -x

    -C:解包

    -z:打包同时压缩

    tar -zcvf 压缩文件名 文件 [文件 ] [文件 ] [文件 ]

磁盘

1
2
3
# tree 查看目录结构
# 先安装,再使用
tree ./
1
2
3
4
5
6
# 查看磁盘占用情况 指定深度 选项参数
du --max-depth=1 -acsh
# 查看硬盘详细情况
df -h
# 查看内存
free -h
1
2
3
# 查看挂载信息
lsblk
lsblk -f
1
2
3
4
# 挂载 挂载点就是一个文件夹
mount 设备名 挂载点
# 挂载点
umount 设备名
1
2
3
4
5
# 添加新硬盘 fdisk 设备名
fdisk /dev/sdb
# 格式化
mkfs -t xfs /dev/sdb1 # mkfs -t xfs(类型) 设备名

进程管理

1
2
3
4
5
6
# 查看所有进程信息 pid ppid
ps -euf # 可以看到父子关系
ps aux # 可以看到系统占用率
# 查看进程父子关系 -p 显示pid -u显示所属用户
pstree

1
2
3
# 终止进程
kill [选项] pid #-9 强制进程立刻停止
killall 进程名
1
2
# 实时监控
top -d(频率) -i(是否闲置) -p(指定pid)
1
# 网络相关 netstat -a(所有套接字)n(尽量显示数字)l(被监听的服务状态)p(调用进程)

Shell编程

shell是一个命令行解释器,那么也可以基于此解释器进行编程;

hello,world

  • 编写一个shell脚本,用于输出Hello,World!

    1. 创建一个hello.sh文件;

    2. 编辑该脚本文件

      1
      2
      #!/bin/bash    //指定编译器,所有.sh文件的第一行都要指定编译器
      echo "Hello,World!" //命令控制行,输出Hello,World!
  • 执行脚本

    执行脚本文件的方法主要有:

    • bash 文件名(可通过相对路径或者绝对路径找到)

    • 文件名(可通过相对路径或者绝对路径找到,注意此方法必须有可执行权限,rwx)

      这两种方法是通过创建当前shell线程的子shell线程完成的;

    • source或者. 文件名(可通过相对路径或者绝对路径找到)

      此方法,是在当前shell线程中执行脚本文件;

变量

变量有两种:

  • 全局变量

    当前bash及其子bash都可见;

    1
    2
     b=3
    export b # b现在是全局变量,注意,更改全局变量的值,只对当前bash有效
  • 局部变量

    只有当前bash线程可见;

    1
    2
    3
    4
    5
    6
    a=2
    echo $a #2
    a=3
    echo $a #3
    mystring="hello,world"
    echo $mystring # hello,world

    注意:用=复制,默认都是字符串;

  • 只读变量

    1
    2
    3
    readonly c=5
    c=10
    -bash: c: 只读变量
  • 撤销变量:unset

    1
    2
    3
    4
    5
    unset a
    unset b
    # 注意,只读变量不可以撤销
    unset c
    -bash: unset: c: 无法反设定: 只读 variable

特殊变量

可能希望自己的脚本可以根据外部参数,得到不同的结果

$n:n是数字,$0代表执行脚本的绝对路径,​$1$9代表第一到第九个参数,十以上的参数用大括号包含,如${10}

  • 新建一个脚本文件并编辑

    1
    2
    3
    4
    5
    #!/bin/bash
    echo '=========$n========'
    echo scripts name:$0
    echo 1st param:$1
    echo 2nd parm:$2
  • 执行,并赋予参数

    1
    2
    3
    4
    5
    ./parameter.sh a b
    =========$n========
    scripts name:./parameter.sh
    1st param:a
    2nd parm:b

$#:返回输入参数的个数

$*:获取所有输入参数,并将其作为一个参数

$@:获取所有输入参数,不过把每个参数区分对待

$?:返回最后一次执行命令的状态,正常返回则输出0,否则输出其它数值

运算符

基本语法:$((运算式))或者$[运算式](expr)

1
2
3
a=$[5*2]
echo $a
10

流程控制

if判断

基本语法:

  • 单分支:

    1
    2
    3
    4
    5
    6
    7
    8
    if [ condition ]; then 多条语句; fi #这里的then fi相当于{}
    # 或者:
    if[ condition ]
    # condition如果 想要包含多个条件 如:$1 = 1 && $2 = 2 应该写为$1 = 1 -a $2 = 2
    # -a and -o or 分别是逻辑与和逻辑或
    then
    语句
    fi
  • 多分支

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    if [ condition ]
    then
    程序
    elif [ condition ]
    then
    程序
    else
    程序
    fi
    # 比如
    #!/bin/bash
    if [ $1 -lt 18 ]
    then
    echo "未成年人"
    elif [ $1 -lt 30 ]
    then
    echo "青年人"
    else
    echo "老年人"
    fi
  • case

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    case 变量名 in   # in 和 )是必须的
    值1) # ;; 表示命令结束,相当于java的break;
    ... # *) 默认分支,default
    ;;
    值2)
    ...
    ;;
    ...
    值*)
    ...
    ;;
    esac # 表示此case结束

循环

for循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 方法1
for((初始值;控制条件;变量变化))
do
语句集
done
#比如
#!/bin/bash
for (( i=1; i<=$1; i++ ))
do
sum=$[ $sum + $i ]
done
echo $sum

# 方法2
for 变量 in 值1 值2 值3 ...
do
程序
done
for os in linux windows macos; do echo $os; done # 把代码写成一行就需要;

while循环

1
2
3
4
while [ 条件 ]
do
程序
done

条件判断

基本语法:

  • test condition
  • [ condition ](前后要有空格)
1
2
3
4
5
a=Hello
test $a = Hello # 等号两边的空格是必须的
#查看执行结果
echo $?
0 # 0代表返回为true

常用判断语句

  • 逻辑运算

    &&,||

    1
    2
    [ liangxi ] && echo ok ||echo notOk   # []为真,执行ok,否则执行notOk
    ok
  • 整数间的比较

    -eq等于

    -ne不等于

    -lt小于

    -le小于等于

    -gt大于

    -ge大于等于

  • 检测某一个文件的权限

    -r-w-x

    1
    [ -r 文件名 ]
  • 判断文件类型

    -e:文件是否存在

    -f:文件存在并且是一个常规文件

    -d:文件存在并且是一个目录

读取控制台输入

`read -t 7 -p “Enter your name in 7 seconds :”NAME

  • -p:设置提示字符
  • -t:指定等待输入的时间,如果不加此选项,表示一直等待

函数

系统函数

$():命令替换,调用系统函数

basename [path] [后缀]:这个命令会得到path最后一个’/‘后的内容,如果有后缀,会去掉后缀的内容

1
2
3
4
basename /root/scrips/parameter.sh 
parameter.sh
basename /root/scrips/parameter.sh .sh
parameter

在脚本中使用系统函数:

1
2
3
4
5
#!/bin/bash
echo '=========$n========'
echo scripts name: $(basename $0 .sh) # $()命令替换 可以取出()内所代表的具体的值
echo 1st param:$1
echo 2nd parm:$2

dirname path:这个命令会得到path最后一个’/‘前的内容;

1
2
cd $(dirname $0)
echo dir parh: $(pwd) #输出被执行脚本的路径

自定义函数

  • 基本语法

    1
    2
    3
    4
    5
    [function] funname[()]
    {
    action;
    [return int;]
    }

    ​ 注意:1.函数必须先声明,再使用,shell是逐行运行,没有预编译的过程;

    ​ 2.函数返回值,只能通过$?获得,如果无return,将返回最后一条命令的运行状态作为返回值(0-255)。

  • 声明及使用

    还是在一个脚本文件中写:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/bin/bash

    function add()
    {
    s=$[ $1 + $2 ]
    echo $s
    }

    read -p "请输入加数a:" a
    read -p "请输入加数b:" b

    sum=$(add $a $b)
    echo "和为" $sum

正则表达式

常规匹配

不包含特殊字符的正则表达式匹配它自己:

1
grep liangxi # 匹配所有包含 liangxi 的行

常用特殊字符

^string

匹配以string为开头的行;

string$

匹配以string为结尾的行;

^$匹配空行

.

.代表一个任意字符

r..t:r{x}{x}t

S*

表示S所代表的字符可以出现0次或多次,且时连续出现

.*:任意字符可以出现任意次

文本处理工具

cut

  • 基本用法

    cut [选项参数] filename

  • 选项参数

    -f:列号,提取第几列;

    -d:分隔符,按指定分隔符分割列,默认是制表符”\t”;

    -c:按字符分割后,加n,表示取第几列

cut -d " " -f 10:把文本按” “进行切割,并取出第10列

awk

  • 基本用法

    awk [选项参数] '/p1/{action1} /p2/{action2} ... ' filename

    p表示在数据中查找的内容,即匹配模式

    action:找到匹配内容时,进行的一系列命令

  • 选项参数

    -F:指定分隔符

    -v:赋值一个用户自定义变量

  • begin ,end

    BEGIN{code}:此代码块会在所有数据行之前执行

    END{code}:此代码块会在所有数据行之后执行