Sherroe's Blog

Linux学习笔记

字数统计: 3.2k阅读时长: 12 min
2022/03/27

[TOC]

本学习笔记基于北京邮电大学蒋砚军老师的《Linux开发环境及应用》课程

登陆

1
ssh name@ip

一些基本Linux命令

man:查阅手册

可以查询各种命令的说明书,系统调用的使用手册,c语言和其他语言的库函数,系统配置文件格式。

man(取自manual)

man name 查询

man 1 name 指定章节号的查询

​ 章节编号:1 命令;2 系统调用;3 库函数;5 配置文件;

man -k regexp 列出关键字与正则表达式(regexp)匹配的手册项目录

q 退出


date:日期与时间

man date 即可查阅关于时间的联机手册。

date 查询时间

date "+%Y-%m-%d" 格式化输出时间,引号内第一个字符必须为+

%Y年;%m月;%d日;%H小时;%M分钟;%S秒;%s秒坐标(自1970年开始);%j今年的第几天;


ntpdate 校准系统时间

ntpdate -q 0.pool.ntp.org 查询当前时间与标准时间之差


cal 打印当前月份的日历

cal 2022 打印2022年的日历

cal 3 2022 打印2022年3月的日历


bc:计算器

可以使用c语言语法进行编程(设定变量,循环等)

bc 进入计算器,缺省精度为小数点后0位

bc -l 进入计算器,缺省精度为小数点后20位

quit 退出


passwd:更换口令

passwd 系统不存储口令明文,而是通过哈希算法加密,且无法由哈希值倒推出原文。


系统状态相关

who 列出当前系统中已经登陆的用户

​ 第一列为用户名,第二列为终端设备文件名

tty 打印出当前终端的设备文件名

who am i 列出当前终端上的登陆用户(包括用户名,终端设备文件名等)

whoami 仅列出当前终端上的登录用户的用户名


uptime 返回当前时间,系统已开机时间,当前登陆入的用户数,系统负载平均数


top 列出资源占用排名考前的进程


ps 查阅当前终端上启动的进程状态

ps -e 查阅所有进程状态

ps命令的其他 - 选项:

-f 以full格式列出;-l 以long格式列出


free 了解内存使用情况


vmstat 了解系统负载

vmstat 1 每隔一秒打印信息

使用 Ctrl+C 以停止vmstat采集数据


处理文本文件

标准输入输出:键盘输入,屏幕输出

重定向

> file.txt 输出到file.txt

< file.txt 从file.txt获取输入


管道

ls - l | sort 将 ls -l 与 sort 两个命令连接在一起


显示文件

more/less:逐屏显示文件

显示一个文件,每显示满一屏幕后停下来。

more file.txt 指定一个文件

more *.[ch] 指定多个文件

more命令
空格 显示下一屏(翻页)
enter 上滚一行
q 退出
/ 搜索指定模式的字符串
h 帮助信息
Ctrl+L 屏幕刷新

less file.txt 大体上与more命令差不多,多一些功能,例如方向键上键向上选取一行


cat file.txt 打印文件所有内容

cat -n file.txt 打印打印文件所有内容并加上行号


od file.txt 逐字节打印

od -t x1 file.txt 以十六进制打印文件字节

x1 十六进制;d1 十进制;u1 无符号十进制;o1 八进制;

od -c 遇到不可打印字符时打印编码


head file.txt 显示文件头部的10行

head -n 15 file.txt 显示文件头部的15行

tail file.txt 显示文件尾部的10行

tail -f file.txt 实时打印文件尾部被追加的内容


文件数据处理

tee file.txt 三通:同时将数据输出到屏幕上并存入文件里

wc file.txt 字计数:列出文件行数,词数和字符数

wc -l 只计算行数


sort 将字符串进行排序

sort -n 对数字按照算数值大小排序,而不是比较字符串


tr string1 string2 翻译字符,将string1中的字符替换为string2中的字符

cat file | tr '[a-z]' '[A-Z]' 将小写字母全部换为大写字母

cat file | tr % '\012' 将%改为换行符


uniq 筛去文件中的重复行(上下紧邻的内容相同的两行)

uniq -u 只保留没有重复的行

uniq -d 只保留有重复的行(重复行只打印一次)

uniq -c 计数重复行的行数


正则表达式

主要用于字符串匹配替换等

基本定义

元字符

元字符 . * [ \ ^ $ 具有特殊含义的字符

使用反斜杠 \ 即可进行转义

圆点 · 可用来匹配任意单字符


集合

在方括号[]之内的字符为集合

[abcd] a或b或c或d

· * \在方括号内时代表他们自己


使用-表示一个区间

[a-z] 所有小写字母

[a-zA-Z0-9] 所有字母和数字


使用^表示补集(必须放在开头)

[^A-Z] 任何一个非大写字母


单字符正则表达式的组合

串结:将字符进行正常排列即可 abc

单字符后跟星号*表示闭包(0或任意多次该字符)

[a-z][0-9]* 一个小写字母后跟任意数量的数字


锚点:$与^

123$ 只匹配字符串尾部的123,$符号必须在尾部

^abc 只匹配字符串首部的abc,^符号必须在首部


扩展正则表达式

ERE与PCRE

与基本正则表达式不兼容

圆括号()表示分组

(xy)* 字符串xy的闭包

|

+ 正闭包

? 出现0或1次


命名的预定义集合:

[[:xdigit:]] 十六进制数字

\d 数字

\D 不是数字


处理命令

grep:查找

grep 在文件中查找字符串

egrep 使用扩展正则表达式ERE查找

fgrep 快速搜索指定字符串

grep选项:

-F 相当于fgrep

-G 使用基本正则表达式(BRE)

-E 使用扩展正则表达式(ERE)

-P 与perl兼容的正则表达式(PCRE)

-n 每行前现实行号

-v 现实所有不好含模式的行

-i 忽略字母大小写


sed:流编辑

sed '命令' 文件名列表

sed -e 可使用多个命令,每输完一个命令后输入-e

sed -f 使用文件输入命令


awk:逐行扫描

符合条件的行,执行相应的动作

awk '程序' 文件名列表

awk -f 使用文件输入程序


每行用空格分开的部分叫做记录的“域”

$1 表示第1域的内容 $2 则表示第2域

$2 表示整行内容


正则表达式应用

详见我的另一篇文章:Linux作业 正则表达式


文件

两文件比较

cmp file1 file2 逐字节比较两个文件是否完全相同

若完全相同,则不给出提示

若有不同,则打印出第一个不同之处

在Windows中也有类似的命令:COMP


md5sum file1 file2 使用MD5算法(散列函数)根据文件内容生成16字节hash值并进行比较

md5sum file1 file2 > files.sum 将生成的值存入文件

MD5失误率(不同文件生成完全相同的哈希值的概率):2^-128 = 3*10^-38

sha1sum SHA-1算法:20字节hash值


diff:比较两个版本的文本文件以寻找两者的差别

diff file1 file2

使用normal格式输出的内容中,a(add)表示新增,c(change)表示修改,d(delete)表示删除

diff -u file1 file2

使用unfined格式输出内容,+表示新增,-表示删除


vi:文本文件编辑

vi file.txt 通过vi编辑器打开file.txt文件

配置文件 $HOME/.exrc

:set 查看当前偏好设置


vi启动后进入命令模式,键盘输入解释为命令,此时按键没有回显

i 进入插入文本编辑状态 a 进入追加文本编辑状态

按下 Esc 以退出文本状态进入命令状态


光标移动

h 左移一列; j 下移一行; k 上移一行; l 右移一列;(方向键同样可用)

^ 移至行首; $ 移至行尾;

w 移至右一个单词; b 移至左一个单词

Ctrl+B 向后翻页;Ctrl+F 向前翻页;(PgUp与PgDn键同样可用)

:476 移至文件第476行; $ 移至文件尾;

% 括号配对:光标在一个括号上时,按下即可定位到其匹配的另一个括号上

命令前加一行整数,表示命令重复执行多少遍


剪切板操作

x 删除当前字符; dd 删除当前行; r 替换光标处字符;

u 取消上一次操作(撤销); . 重复上一次动作;

ZZ 存盘退出; :wq + Enter 存盘退出; :w + Enter 仅存盘; q! + Enter 不存盘退出;

:r file.c 读入文件file.c插入到当前行之下

:50,$w file.c 把第50行到文件尾的内容写到file.c中; :50,$w! file.c 强制覆盖

:10,50d 删除10到50行(同时复制内容)

:10,40y 复制10到50行

p 粘贴

:7,9CO56 复制7到9行的内容并粘贴到56行下

:8,10m78 移动8到10行的内容到78行下

J 将当前行下一行合并到当前行

Ctrl+L 屏幕刷新; Ctrl+G 显示状态


查找与替换

/ 查找命令,后接正则表达式。如: /[0-9][0-9]*

n 查找下一个; N 查找上一个;

:1,50s/abc/xyz 在1到50行中,将每行的第一个abc替换为xyz(每行只替换一次)

:1,50s/abc/xyz/g 在1到50行中,将所有abc替换为xyz

:50,80s/^/ / 将50到80行右移四列(将每行开头的空字符替换为4个空格)


文件管理和目录管理

ls:列出文件目录

可使用实参列出文件

-F /目录 *可执行文件 @符号连接文件

-l 长格式列表 第1列:文件属性 第2列:文件link数 第3、4列:文件主的名字和小组名字 第5列:文件大小(字节数)(目录:目录表大小) 第6列:最后一次修改时间 第7列:文件名

-h 便于阅读的方式打印数值

-d 列出目录自身信息

-a 列出文件名首字符为圆点的文件(用户偏好设置等)

-A 同上,不列出...

-s 文件占用磁盘空间

-i 文件的i节点号


cp:拷贝文件

cp file1 file2 cp file1 file2 dir

file2不存在则创建,存在则覆盖

mv:移动文件(相当于剪切,效率高于拷贝后再删除)

mv file1 file2

mv file1 file2 file3 dir 把三个文件移动到目录下

mv dir1 dir2

rm:删除文件

rm file1 file2 file3

rm *.o 删除所有.o文件

-r 递归删除

-i 删除前需要确认

-f 强迫删除(可删除只读文件)

使用--对命令参数进行转义:rm -i无法删除名为-i的文件,使用rm -- -i命令,让系统不将-开头的部分识别为命令参数。


Linux系统下目录使用/分割,Windows系统下目录使用\分割

pwd 打印当前工作目录

cd /usr/include 改变当前工作目录 cd 回到主目录

mkdir 创建目录

-p 自动创建路径中不存在的目录

rmdir 删除目录,要求不存在除.和..之外的文件或目录

-r 递归删除

cp -r 目录复制

-v 冗长方式,实时列出正在复制的文件名

-u 增量拷贝,便于备份目录。不拷贝相同或过时版本(比较时间戳)的文件

touch 将文件最后修改时间变成当前时间

rsync 数据备份工具


find 遍历目录树

find ver1.d ver2.d -name '*.c' -print 在ver1.d和ver2.d中查找.c文件并打印路径

-name 后跟文件名,必须有引号

-regex 整蛊路径名与正则表达式匹配

-type 后跟单个字母:f普通文件,d目录,l符号连接文件,c字符设备文件,b块设备文件,p管道文件

-size 指定文件大小,后跟符号:+表示大于,-表示小于

-mtype 文件最近修改时间

-newer 文件比文件更新

-print 打印文件路径名

-exec 其后到分号之间的内容作为一条施加在查找到的文件上的命令

-ok 同上,多一步确认


xargs 将标准输入组织成命令执行

-n 指定每批处理多少个

tar 文件归档


CATALOG
  1. 1. 登陆
  2. 2. 一些基本Linux命令
    1. 2.1. man:查阅手册
    2. 2.2. date:日期与时间
    3. 2.3. bc:计算器
    4. 2.4. passwd:更换口令
    5. 2.5. 系统状态相关
  3. 3. 处理文本文件
    1. 3.1. 重定向
    2. 3.2. 管道
    3. 3.3. 显示文件
    4. 3.4. 文件数据处理
  4. 4. 正则表达式
    1. 4.1. 基本定义
      1. 4.1.1. 元字符
      2. 4.1.2. 集合
      3. 4.1.3. 单字符正则表达式的组合
      4. 4.1.4. 锚点:$与^
    2. 4.2. 扩展正则表达式
    3. 4.3. 处理命令
      1. 4.3.1. grep:查找
      2. 4.3.2. sed:流编辑
      3. 4.3.3. awk:逐行扫描
    4. 4.4. 正则表达式应用
  5. 5. 文件
    1. 5.1. 两文件比较
    2. 5.2. vi:文本文件编辑
      1. 5.2.1. 光标移动
      2. 5.2.2. 剪切板操作
      3. 5.2.3. 查找与替换
      4. 5.2.4. 文件管理和目录管理