linux 入门

常用快捷键

按键 作用
Ctrl+d 键盘输入结束或退出终端
Ctrl+s 暂停当前程序,暂停后按下任意键恢复运行
Ctrl+z 将当前程序放到后台运行,恢复到前台为命令 fg
Ctrl+a 将光标移至输入行头,相当于Home
Ctrl+e 将光标移至输入行末,相当于End
Ctrl+k 删除从光标所在位置到行末
Alt+Backspace 向前删除一个单词
Shift+PgUp 将终端显示向上滚动
Shift+PgDn 将终端显示向下滚动

shell 常用通配符

字符 含义
* 匹配 0 或多个字符
? 匹配任意一个字符
[list] 匹配 list 中的任意单一字符
[^list] 匹配 除 list 中的任意单一字符以外的字符
[c1-c2] 匹配 c1-c2 中的任意单一字符 如:[0-9][a-z]
{string1,string2,...} 匹配 string1 或 string2 (或更多)其一字符串
{c1..c2} 匹配 c1-c2 中全部字符 如{1..10}

一次创建多个文件,touch jiang_{1..10}.txt, 创建 jiang_1.txt - jiang_10.txt

用户、文件权限管理

查看用户

who命令,常用参数

参数 说明
-a 打印能打印的全部
-d 打印死掉的进程
-m am imom likes
-q 打印当前登录用户数及用户名
-u 打印当前登录用户登录信息
-r 打印运行等级

用户组

在 Linux 里面每个用户都有一个归属(用户组),用户组简单地理解就是一组用户的集合,它们共享一些资源和权限,同时拥有私有资源。

groups lilei , 查看用户lilei 的用户组信息

sudo usermod -G sudo lilei, 给用户添加 用户组

sudo deluser lilei --remove-home, 删除用户, —remove-home 一并删除工作目录

文件访问权限

文件权限

  • 一个目录同时具有读权限和执行权限才可以打开并查看内部文件,而一个目录要有写权限才允许在其中创建其它文件,这是因为 目录文件实际保存着该目录里面的文件的列表等信息

变更文件所有者

sudo chown liuzhenjiang fileName, 修改 fileName 文件的所有者为 liuzhenjiang

修改文件权限

修改文件权限

方式一: 二进制数字表示

每个文件有三组固定的权限,分别对应 拥有者、所属用户组、其他用户。文件的读写执行 对应字母 rwx,以二进制 表示 111,十进制 表示 7

  • rw-rw-rw-,换成对应的十进制 为 666, 这表示 文件的 拥有者、所属用户组、其他用户 具有 读写权限,不具有执行权限
  • chmod 600 fileName, 修改 fileName 权限 为 600
方式二: 加减赋值操作

chmod go-rw fileName

  • g ,o,u, 表示 group(用户组),others(其他用户),user(用户)
  • +,-, 增加、去掉相应权限

目录结构

FHS 文件系统规范: https://refspecs.linuxfoundation.org/FHS_3.0/fhs-3.0.pdf

环境变量

添加自定义路径到”PATH”环境变量

PATH 里面路径以:作为分隔符, 添加路径 一定要使用绝对路径

1
PATH=$PATH:/home/shiyanlou/mybin

在每个用户的 home 目录中有一个 shell 每次启动时默认执行的一个配置脚本,用来初始化环境,其中就包括添加用户自定义环境变量等。

shell 是 zsh,它的配置文件 是.zshrc

shell 是 bash, 它的配置文件是.bashrc

将添加环境变量的命令追加 (>>) 到.zshrc中,

1
echo "PATH=$PATH:/home/shiyanlou/mybin" >> .zshrc

搜索文件

与搜索相关的命令 常用的 有 whereis,which,find,locate

  • whereis ,简单快速,直接从数据库中查询,而非从硬盘中依次查找

    搜索 二进制文件,原码文件,man 帮助文件 所在的路径

    1
    2
    whereis find
    /usr/bin/find
  • locate,通过查询/var/lib/mlocate/mlocate.db数据库来检索信息,不过这个数据库不是实时更新的,系统有定时任务每天自动执行updatedb命令来更新数据库 -c参数,统计数目

    1
    locate /usr/share/*.jpg       // 查找/usr/share/ 下 所有jpg文件
  • which , shell 内建的命令,通常用于确定 是否安装了某个 指定的程序

    1
    2
    which man
    /usr/bin/man
  • find ,功能强大,不但可以通过文件类型、文件名进行搜索,还可以根据文件的属性(文件时间戳、文件权限等)进行搜索。

    基本的命令 格式 find [path][option] [action]

    与时间相关的命令参数

    参数 说明
    -atime 最后访问时间
    -ctime 最后修改文件内容的时间
    -mtime 最后修改文件属性的时间

    -mtime c 参数举例

    • -mtime n, 在 n 天之前的”一天之内”修改过的文件 , n 为 0 ,表示当天 有改动的文件
    • -newer file, 列出比 file 文件还要新的文件名

文件打包与解压缩

文件后缀名 说明
*.zip zip 程序打包压缩的文件
*.rar rar 程序压缩的文件
*.7z 7zip 程序压缩的文件
*.tar tar 程序打包,未压缩的文件
*.gz gzip 程序(GNU zip)压缩的文件
*.xz xz 程序压缩的文件
*.bz2 bzip2 程序压缩的文件
*.tar.gz tar 打包,gzip 程序压缩的文件
*.tar.xz tar 打包,xz 程序压缩的文件
*tar.bz2 tar 打包,bzip2 程序压缩的文件
*.tar.7z tar 打包,7z 程序压缩的文件

文件系统操作 、磁盘管理

查看磁盘、目录的容量
  • df 命令查看磁盘容量 df -h
  • du 命令 查看 目录的容量
    • du -h, 易读方式展示
    • du -h -d 0, 查看 1 级目录的信息 -d 参数,指定目录的深度
简单磁盘管理
  • 创建虚拟磁盘

    • 使用dd命令,从/dev/zero设备 创建一个容量 为 256M 的空文件 virtual.img

      1
      dd if=/dev/zero of=virtual.img bs=1M count=256
    • 使用 mkfs命令格式化磁盘 成为 文件系统

      1
      sudo mkfs.ext4 virtual.img
    • 使用 mount 命令 挂载磁盘到目录树, mount 命令查看主机已经挂载的文件系统

      mount 命令的一般格式

      1
      2
      3
      mount [options] [source] [directory]

      mount [-o [操作选项]] [-t 文件系统类型] [-w|--rw|--ro] [文件系统源] [挂载点]
  • 磁盘分区 , fdisk


管道

管道是一种通信机制,常用于进程间的通信,网络通信通常通过 scoket,它的表现形式就是将每一个进程的输出(stdout)直接作为下一个进程的输入(stdin)。

  • 匿名管道 ,命令行中的|符号 ls -al | less,
  • 具名管道,通常只会在源程序中用到

cut ,打印某一行的某个字段

1
2
3
4
5
6
7
8
9
10
# 以 :为分隔符的第1个字段和第6个字段
cut /etc/passwd -d ':' -f 1,6
# 前五个(包含第五个)
cut /etc/passwd -c -5
# 前五个之后的(包含第五个)
cut /etc/passwd -c 5-
# 第五个
cut /etc/passwd -c 5
# 2 到 5 之间的(包含第五个)
cut /etc/passwd -c 2-5

grep, 查找匹配字符串

grep 命令一般形式 grep [命令选项]... 用于匹配的表达式 [文件]...

1
2
3
4
5
6
7
8
# 查看环境变量中以 "yanlou" 结尾的字符串
export | grep ".*yanlou$"

# 搜索 当前用户目录下所有包含 "shiyanlou"的文本文件,并显示出现在文本中的行号
# -r 递归搜索子目录中文件
# -n 打印匹配项行号
# -I 忽略二进制文件
grep -rnI "shiyanlou" ~

wc, 简单计数工具

1
2
3
4
5
6
7
8
9
10
11
12
13
	# 行数
wc -l /etc/passwd
# 单词数
wc -w /etc/passwd
# 字节数
wc -c /etc/passwd
# 字符数
wc -m /etc/passwd
# 最长行字节数
wc -L /etc/passwd

# 统计/etc 下面所有目录数
ls -dl /etc/*/ | wc -l

sort 排序

sort 命令将输入按一定方式排序后再输出。支持的排序有按字典排序,数字排序,按月份排序,随机排序,反转排序等

1
2
3
# -t 参数 指定字段的分隔符,-k 字段号,指定对哪一个字段进行排序
# 默认以字典排序,-n 参数 按照数字排序
cat /etc/passwd | sort -t':' -k 3 -n

文本处理

  • tr 命令, 用来删除一段文本信息中的某些文字,或将其进行转换

    1
    2
    3
    4
    5
    6
    7
    # 删除 "hello shiyanlou" 中所有的'o''l''h'
    $ echo 'hello shiyanlou' | tr -d 'olh'
    # "hello" 中的ll,去重为一个l
    $ echo 'hello' | tr -s 'l'
    # 将输入文本,全部转换为大写或小写输出
    $ echo 'input some text here' | tr '[:lower:]' '[:upper:]'
    # 上面的'[:lower:]' '[:upper:]'你也可以简单的写作'[a-z]' '[A-Z]',当然反过来将大写变小写也是可以的
  • join 命令,将两个文件中包含相同内容的那一行合并在一起

    1
    2
    3
    4
    5
    6
    7
    8
    9
    cd /home/shiyanlou
    # 创建两个文件
    echo '1 hello' > file1
    echo '1 shiyanlou' > file2
    join file1 file2
    # 将 /etc/passwd 与 /etc/shadow 两个文件合并,指定以':'作为分隔符
    sudo join -t':' /etc/passwd /etc/shadow
    # 将 /etc/passwd 与 /etc/group 两个文件合并,指定以':'作为分隔符,分别比对第4和第3个字段
    sudo join -t':' -1 4 /etc/passwd -2 3 /etc/group
  • paste 命令, 在不对比的情况下,将多个文件合并,以 tab隔开

    1
    2
    3
    4
    5
    6
    7
    echo hello > file1
    echo shiyanlou > file2
    echo www.shiyanlou.com > file3
    # -d 指定合并的分隔符 :
    paste -d ':' file1 file2 file3
    # -s 合并时, 每个文件为一行
    paste -s file1 file2 file3

数据流重定向

linux 默认提供了三个特殊设备

文件描述符 设备文件 说明
0 /dev/stdin 标准输入
1 /dev/stdout 标准输出
2 /dev/stderr 标准错误

文件描述符: 一个非负整数,实际上它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。

标准错误重定向

标准输出和标准错误虽然都指向终端屏幕,但实际上它们不一样。需要使用文件描述符

1
2
3
4
# 将标准错误重定向到标准输出,再将标准输出重定向到文件,注意要将重定向到文件写到前面
cat Documents/test.c hello.c >somefile 2>&1
# 或者只用bash提供的特殊的重定向符号"&"将标准错误和标准输出同时重定向到文件
cat Documents/test.c hello.c &>somefilehell

在输出重定向文件描述符前加&,否则 shell 会当做重定向到一个文件名为 1 的文件

永久重定向

当需要某一部分的命令的输出全部进行重定向,可使用 exec命名实现永久重定向。

exec命令,使用指定的命令替换当前 Shell, 即 使用一个进程替换当前进程,或指定新的重定向

1
2
3
4
5
6
7
8
# 先开启一个子 Shell
zsh
# 使用exec替换当前进程的重定向,将标准输出重定向到一个文件
exec 1>somefile
# 后面你执行的命令的输出都将被重定向到文件中,直到你退出当前子shell,或取消exec的重定向(后面将告诉你怎么做)
ls
exit
cat somefile

进程-工作管理

bash 支持 job(工作控制),通过 & 符号,可让命令在后台运行 ls &

crtl + z可是 工作停止并丢到后台中

jobs命令 查看 被放置在后台的工作

fg [jobnumber], 将后台的工作拿到前台开

1
2
3
# 后面不加参数提取预设工作,加参数提取指定工作的编号
# ubuntu 在 zsh 中需要 %,在 bash 中不需要 %
fg [%jobnumber]

bg [jobnumber], 在后台运作指定 job

kill -signal jobnumber/pid, 对 job 或 pid 对于进程 进行操作

kill 常用信号值

信号值 作用
-1 重新读取参数运行,类似与 restart
-2 如同 ctrl+c 的操作退出
-9 强制终止该任务
-15 正常的方式终止该任务

进程查看、控制

ps 静态查看当前进程的信息; top实时查看进程的状态;pstree查看当前活跃进程的树形结构

ps aux ,罗列所有的进行信息,ps aux | grep zsh, 查找匹配的进程

Kill 命令

当一个进程结束时,或者异常结束时,会向其父进程返回一个,或接受一个 SIGHUP 信号 而做出的结束进程。这个 SIGHUP 信号不仅可以有系统发送,也可以使用kill命令来发送这个信号,来操作进程的结束或重启等等

正则表达式

grep 命令用于打印输出文本中匹配的模式串,其常用参数

参数 说明
-b 将二进制文件作为文本来进行匹配
-c 统计以模式匹配的数目
-i 忽略大小写
-n 显示匹配文本所在行的行号
-v 反选,输出不匹配行的内容
-r 递归匹配查找
-A n n 为正整数,表示 after 的意思,除了列出匹配行之外,还列出后面的 n 行
-B n n 为正整数,表示 before 的意思,除了列出匹配行之外,还列出前面的 n 行
--color=auto 将输出中的匹配项设置为自动颜色显示

特殊符号

参数 说明
-b 将二进制文件作为文本来进行匹配
-c 统计以模式匹配的数目
-i 忽略大小写
-n 显示匹配文本所在行的行号
-v 反选,输出不匹配行的内容
-r 递归匹配查找
-A n n 为正整数,表示 after 的意思,除了列出匹配行之外,还列出后面的 n 行
-B n n 为正整数,表示 before 的意思,除了列出匹配行之外,还列出前面的 n 行
--color=auto 将输出中的匹配项设置为自动颜色显示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# grep默认是区分大小写的,这里将匹配所有的小写字母
echo '1234\nabcd' | grep '[a-z]'
# 将匹配所有的数字
echo '1234\nabcd' | grep '[0-9]'
# 将匹配所有的数字
echo '1234\nabcd' | grep '[[:digit:]]'
# 将匹配所有的小写字母
echo '1234\nabcd' | grep '[[:lower:]]'
# 将匹配所有的大写字母
echo '1234\nabcd' | grep '[[:upper:]]'
# 将匹配所有的字母和数字,包括0-9,a-z,A-Z
echo '1234\nabcd' | grep '[[:alnum:]]'
# 将匹配所有的字母
echo '1234\nabcd' | grep '[[:alpha:]]'