linux基本操作学习
目录
[toc]
前言及参考资料
这篇文章主要给出各个指令的作用,详细用法请查阅相关资料,灵活使用man指令和--help选项。仅当我认为重要的时候,会给出详细用法和示例。
这篇文档会跟随着作者对linux的使用而持续更新。主要是记录一些注意的地方。
参考资料:
- Linux命令行与shell脚本编程大全
- 菜鸟教程-Linux指令大全
- linux的使用
- man的使用
man的使用
注意man
可能会提供9个章节,每个章节有相应内容,请输入man man
进行了解,如
- man 1 man
- man -f ls
:可以查看ls
指令有什么页面。
- 章节有:
- 1 可执行程序或 shell 命令,用法查这个
- 2 系统调用(内核提供的函数)
- 3 库调用(程序库中的函数)
- 4 特殊文件(通常位于 /dev)
- 5 文件格式和规范,如 /etc/passwd,编写程序看2-5
- 6 游戏
- 7 杂项(包括宏包和规范), 如 man(7),groff(7), man-pages(7)
- 8 系统管理命令(通常只针对 root 用户)
- 9 内核例程 非标准
基本指令
echo
文件系统
文件管理
文件权限管理
文件修改
ln
用于创建软硬链接。不加参数是硬链接,加上-s
参数则是软链接。
文件压缩与解压缩
压缩文件指令
gzip
可以解决后缀为Z,zip,gz等后缀的压缩文件。比较重要的参数:c(压缩数据输出到屏幕),d(解压缩),t(检查错误),v(显示具体信息),-number(压缩等级,number为1最快,压缩比最差,9反之,默认是6)。
注意其可以被windows下的winRAR和7zip等软件处理。
坑点:注意压缩后会删除原来的文件!所以最好使用
gzip -c file > file.gz
进行操作
另外,zcat,zmore,zless
可以用来读取被压缩后的纯文本文件
bzip2
压缩效果比gzip更好,后缀名是bz2,用法与gzip2差不多
相应的,有bzcat,bzmore和bzless
xz
压缩效果比bzip2更好,后缀名是x2,用法与gzip2差不多
相应的,有xzcat,xzmore和xzless
zip与unzip
tar:文件打包
注意gzip等压缩对目录压缩的方式是对里面的文件分别进行压缩,导致压缩效果较差,而tar可以进行打包。
-zjJ
:三种不同压缩方式,依次为gzip,bzip2,xz.
-c
:进行压缩
-x
:进行解压缩
-t
:查询一个压缩包有哪些文件
-C <dir>
:解压在dir目录中
-f <file>
:需要处理的压缩文件名file
-v
:展示被处理的文件名
-p
:保留文件原有权限(重要)
--exclude=<file>
:不打包file文件,注意/etc*表示不打包/etc开头的文件
压缩:
tar -jcv -f file.tar.bz2 <要被压缩的一系列文件和目录>
查询:tar -jtv -f file.tar.bz2
解压缩:tar -jxv -f file.tar.bz2 -C <解压到的目录>
解压指定文件:tar -jxv -f file.tar.bz2 <解压的文件(需要先查询压缩包内的文件)>
dpkg:文件解压缩
光盘文件制作及刻录
mkisofs
,cdrecord
其他
关于备份工具,光盘写入工具和dd等指令,详见鸟哥的Linux厨房一书。
文档编辑
参考文档
find
作用:递归列出目录下的所有文件。常配合grep使用。详细用法见此 ,支持按照文件特征如创建时间,修改时间,创建用户,用户组等查找。
1 | find /opt/module/datax/job/export -type f -prune -exec sed -i 's/hadoop151:3306/hadoop101:3306/g' {} + |
sed
主要用于编辑相应文件。一行一行处理。支持新增,取代,打印,删除,插入等功能。详细用法见此
1 | sed '3d' xxx.txt # 删除文件第3行 |
选项说明:
-i
,-i.bak
:直接在源文件上修改,如果有.bak,则源文件备份到后缀名为.bak的文件里面
's/pattern/result/g'
:将符合正则表达式的pattern
替换成result
,注意s前加n,m表示只修改n到m行的内容。
-n
:只打印修改的内容
3p
:打印第三行的内容,配合-n使用更好,2,9p
表示打印2到9行的内容。/pattern/p
则是表示显示符合条件pattern的行
2d
:删除第二行的内容,$d
则是删除最后一行的内容,/pattern/d
则是表示删除符合条件pattern的行
-e
选项表示将结果输出到stdout,不修改源文件
5a # comment
表示在第五行后增添# comment
字符串一行
awk
非常强大而又复杂的文本处理工具,支持打印相应位置文本,按照指令分隔符分割,过滤文本内容输出等作用。下面是一些简单的介绍,更多具体用法见此
注意,awk是行处理工具,一行一行处理的。
格式:
1 | awk 'PATTERN{ACTIONS} filename' |
注意有以下变量:
FS
输入间隔副,OFS
输出间隔符,NR
行号,从1开始,NF
分隔后的字段数量。
这里再提供一个使用脚本的示例,注意脚本文件格式为awk,第一行需要指定 /bin/awk
:
1 |
|
1 | awk -f cal.awk score.txt |
打印乘法表的有趣示例:
1 | seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}' |
计算文件大小的有趣示例:
1 | ls -l *.txt | awk '{sum+=$5} END {print sum}' |
find
grep
作用是将输出在命令行上的内容进行匹配筛选处理。
注意 grep
使用正则表达式有点坑。要么开 -e
选项,要么用 egrep
,要么注意 |
要转义才能发挥正则匹配的作用,但 ^
和 $
作为锚点不需要转义。
-v反向匹配,匹配到的不输出
进程管理
kill
准确地来说,kill是向相应进程发送中断信号。-9
是强制停止。相应信号见此 。
top
ps
用户管理
useradd, groupadd
网络相关操作
ssh
存储管理
基础知识
块设备文件
文件系统介绍
文件系统驱动都在/lib/modules/$(uname -r) /kernal/fs
目录下面
ext4
常用指令
块设备信息查看
dumpe2fs
:查看ext*文件系统的信息blkid
:列出所有block的idlsblk
:列出所有block的层级关系df
:查看某文件所使用的文件系统du
:查看某文件所用量
分区管理与格式化
parted <blk_dev> print
:列出某个block的基本信息,注意这个工具还可以进行分区操作。man一下。gdisk,fdisk
:分区工具,前者是GPT格式,后者是MBR格式,使用前使用parted指令进行查询partprobe -s
:刷新分区表,使得分区更新立即生效mkfs.*
:文件系统make工具,给新分区格式化使用- agcount是存储群组数量,一般设置为cpu数量
- 务必注意所称的“大小”的单位,在有必要的时候请使用
man
进行查看。
fsck.*
:对文件系统进行检查,注意只有有问题的时候才能使用,否则会造成危害
挂载与卸载
mount -t <fs> UUID="" <dir>
:将设备UUID为""的设备挂载到dir下面,使用fs文件系统- 有iocharset选项,可以用utf8
- 注意-o有很多额外选项,请使用man查看
mount -n -o remount,rw /
根目录重新挂载,如果陷入只读模式下可以考虑使用。dd if="/dev/zero" of="/dev/loop0" bs=1M count=512
创建一个文件为/dev/loop0(注意这可能是个设备),往里面写0进去,一个block1M,一共512个Block如果需要使用一个大文件进行挂载操作(而不是目录),可以利用dd进行初始化,然后利用mkfs对大文件进行文件系统的制作,然后用blkid来查询id,然后利用mount的
-o loop
选项进行挂载。如果需要设置启动挂载,注意开机自动挂载的文件配置在
/etc/fstab
中。如果用的是大文件而不是物理区块,请使用文件路径名标记。编辑后,请务必使用mount -a
检查是否有语法错误。mkswap
和swapon
可以用来制作交换分区。注意也可以使用文件来制作。
管道与重定向
>
覆盖,>>
重定向,2>
表示stderr的数据重定向。<
重定向输入,<<
约定EOF标志,如<< "end"
约定end为EOF标志。
/dev/null
:把数据输入到这里面相当于丢掉所有输出数据
写入同一文件的语法:echo hello > test 2>&1
或echo hello &> test
:stdout和stderr的数据全部输入到test中
管道|
:会将上一条指令的stdout作为下一条指令的stdin,如果希望stderr能够被下一条指令处理,需要2>&1
进行重定向
tee
:将数据同时输出到stdout和某个文件,双向重定向
xargs
xargs -0pne [command]
-0
:碰到特殊符号时候转换成一般字符
-p
:执行每个指令时进行询问
-n
:取多少个参数执行
环境变量详解
- 直接修改
$PATH
:export PATH=$PATH:/home/uusama/mysql/bin
,注意仅在当前bash有效 - 修改
~/.bashrc
或~/.bash_profile
:永久对当前用户生效,即使打开新的bash - 修改
/etc/bashrc
或/etc/profile
或/etc/environment
:永久对所有用户生效,即使打开新的bash
注意需要source
命令或重启使改变生效。
疑问:
.bashrc
和.bash_profile
的区别?加载顺序会有不同,详见此处
脚本编写
基本语法
变量
set
&unset
:设置变量和删除变量
readonly
:限定只读
基本运算
test
:用于输出一个表达式的结果
expr 2 + 2
:注意表达式之间要有空格
[ $a == $b ]
:注意条件表达式放方括号,并且有很多空格
-le
:使用这些命令来比较大小,因为<>被用于重定向了
!
&-a
&-o
&&&
&||
:布尔运算
-z
&-n
:字符串运算符,后面跟字符串,检查长度是否为0
$a
:检查字符串a是否为空,不为空则为true
还有文件测试运算符
变量测试与赋值
v=${var-expr}
:var未设置则将v赋值为expr,否则为var
v=${var+expr}
:var设置则将v赋值为expr,否则为空串
v=${var=expr}
:var未设置则将var和v同时赋值为expr,否则v赋值为var
v=${var?expr}
:var未设置则expr输出到stderr,否则v赋值为var
注意这些符号之前可以加冒号,此时var为空字符串也会视为没有设置相应的var变量。
字符串
字符串种类
单引号字符串:原样输出,但注意awk的
'{print $1}'
双引号字符串:支持变量和转义符
反引号:先执行
字符串变量
1 | s="str" |
字符串匹配
1 | ${var#key}:从前往后,var中匹配上key的最短部分,去除 |
例:echo ${PATH##/*:}
数组
注意数组分隔估计和环境变量
IFS
有关,IFS
是分隔符,默认是\r\n
三个
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 array=(1 2 3)
array=(
1
2
3
)
array[0]=9
array[n]=2
echo ${array[@]}
echo ${array[*]} # 两个都是打印整个数组
echo ${#array[@]} # 打印数组长度
# 关联数组(实际就是个map)
declare -A site
site["google"]="www.google.com"
site["runoob"]="www.runoob.com"
site["taobao"]="www.taobao.com"
echo ${site[*]} ${site[@]} # 获取所有值
echo ${!site[*]} ${!site[@]} # 获取所有键
控制结构
条件表达
(( $a > $b ))
:注意两个圆括号可以用大于符号
((i=1;i<9;i++))
:for循环可以用
[ cond ]:
注意要有括空格,注意用变量的时候要用双引号括起来才行,但test可以直接用,大于号和小于号会当成重定向,要加转移符
[[ cond ]]
:bash自己实现的,迁移性较差
test cond
:
for v in $@
:注意用循环结构的时候,要区分"$@" "$*" $@ $*
的区别
控制结构模板
1 |
|
其他
特殊变量
${p}
:第p
个参数,echo $0
的结果是echo
,当p
小于10时可以不带花括号,否则必须带
$#
:参数个数
$*
和$@
:获取参数,其中前者以字符串的形式获取,后者是加引号,然后在引号中返回每个参数。假设在脚本运行时写了三个参数 1、2、3,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。
$?
:上一个shell命令的返回状态码
$$
:当前shell环境的进程ID号
1 | echo "-- \$* 演示 ---" |
间隔符
基本符号的用法
引号
单引号:将其中的内容全部作为字符串,忽略所有的命令和特殊字符
双引号:解析特殊字符,包括', ", $, \
,如果需要输出这些字符,需要转义符
反引号:包含一个命令字符串的,其中的命令会先执行,如`ls`等效于$(ls)
括号
参考资料见此 。
- 大括号:
- 中括号:
- 小括号:注意小括号实际上开了一个子shell!
小练习
练习1:请将git status中,将所有模式处于xxx的文件,全部更改为yyy?
练习2:将所有文件名后缀为xxx中的文件里,前缀有yyy的单词,统一替换为zzz
练习3:找出大小超过500MB的所有文件,并将其在git记录中进行--uncached处理(作者遇到的问题,暂时不知道怎么处理?)
- Title: linux基本操作学习
- Author: spiritTrance
- Created at: 2023-08-21 15:33:07
- Updated at: 2024-01-06 20:07:52
- Link: https://spirittrance.github.io/2023/08/21/linux_linux基本操作学习/
- License: This work is licensed under CC BY-NC-SA 4.0.