linux基本操作学习

linux基本操作学习

spiritTrance

目录

[toc]

前言及参考资料

这篇文章主要给出各个指令的作用,详细用法请查阅相关资料,灵活使用man指令和--help选项。仅当我认为重要的时候,会给出详细用法和示例。

这篇文档会跟随着作者对linux的使用而持续更新。主要是记录一些注意的地方。

参考资料:

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厨房一书。

文档编辑

参考文档

linux三剑客

find

作用:递归列出目录下的所有文件。常配合grep使用。详细用法见,支持按照文件特征如创建时间,修改时间,创建用户,用户组等查找。

1
find /opt/module/datax/job/export -type f -prune -exec sed -i 's/hadoop151:3306/hadoop101:3306/g' {} +

sed

主要用于编辑相应文件。一行一行处理。支持新增,取代,打印,删除,插入等功能。详细用法见

1
2
3
4
5
6
sed '3d' xxx.txt 		# 删除文件第3行
sed "$d" xxx.txt # 删除文件最后一行
sed ’s/^[ ]*//g’ xxx.txt # 删除空格
sed 's/test/mytest/g' xxx.txt # 替换:把test替换为mytest。如果没有g标记,则只有每行第一个匹配的test被替换成mytest。
sed ‘s/pattern/&\n/g’ filename # 添加新行(向前)
sed -i ‘$ a\插入字符串’ filename # 在最后一行插入字符

选项说明:

-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
2
3
4
5
6
7
8
awk 'PATTERN{ACTIONS} filename'
awk -F':' '{print $1,$2}' file # 指定冒号为分隔符
awk -v'FS=:' '{print $1,$2}' file # 指定冒号为分隔符
awk 'BEGIN{OFS=FS="\t"}{print $0, $1;}' filename # 指定分隔符为制表符
awk '{if(NR>=20 && NR<=30) print $1}' test.txt # 输出20行到30行的内容
awk 'NR>=20 && NR<=30{print $1}' test.txt # 输出20行到30行的内容
awk '/re/ ' log.txt # 输出包含re的行
awk '$2 ~ /th/ {print $2,$4}' log.txt # 输出第二列包含 "th",并打印第二列与第四列,~表示模式开始,!~表示模式取反(排除在外)

注意有以下变量:
FS输入间隔副,OFS输出间隔符,NR行号,从1开始,NF分隔后的字段数量。
0则是整行

这里再提供一个使用脚本的示例,注意脚本文件格式为awk,第一行需要指定 /bin/awk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/awk -f
# here is cal.awk
#运行前
BEGIN {
math = 0
english = 0
computer = 0

printf "NAME NO. MATH ENGLISH COMPUTER TOTAL\n"
printf "---------------------------------------------\n"
}
#运行中
{
math+=$3
english+=$4
computer+=$5
printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5
}
#运行后
END {
printf "---------------------------------------------\n"
printf " TOTAL:%10d %8d %8d \n", math, english, computer
printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR
}
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的id
  • lsblk:列出所有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检查是否有语法错误。

  • mkswapswapon可以用来制作交换分区。注意也可以使用文件来制作。

管道与重定向

>覆盖,>>重定向,2>表示stderr的数据重定向。<重定向输入,<<约定EOF标志,如<< "end"约定end为EOF标志。

/dev/null:把数据输入到这里面相当于丢掉所有输出数据

写入同一文件的语法:echo hello > test 2>&1echo hello &> test:stdout和stderr的数据全部输入到test中

管道|:会将上一条指令的stdout作为下一条指令的stdin,如果希望stderr能够被下一条指令处理,需要2>&1进行重定向

tee:将数据同时输出到stdout和某个文件,双向重定向

xargs

xargs -0pne [command]

-0:碰到特殊符号时候转换成一般字符
-p:执行每个指令时进行询问
-n:取多少个参数执行

环境变量详解

  • 直接修改 $PATHexport 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
2
3
4
s="str"
echo ${#s} # 输出s的长度
echo ${s:1:2} # 输出tr
echo `expr index "$string" io` # 输出字符rt的下标,这里是1

字符串匹配

1
2
3
4
5
6
${var#key}:从前往后,var中匹配上key的最短部分,去除
${var##key}:从前往后,var中匹配上key的最长部分,去除
${var%key}:从后往前,var中匹配上key的最短部分,去除
${var%%key}:从后往前,var中匹配上key的最长部分,去除
${var/old_str/new_str}:第一个匹配上old_str的部分用new_str替换
${var//old_str/new_str}:所有匹配上old_str的用new_str替换

例: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
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


# if
if [[ cond ]]; then
expr1
elif [[ cond ]]; then
expr2
fi

# for
for((i=1;i<=9;i++)); do
expr
done
for var in a b c; do
expr
done
for var in $@; do
expr
done

# case
case $var in
1)
expr1;;
2|3|4)
expr2
;;
*)
defaultexpr
;;
esac
# while

其他

特殊变量

${p}:第 p个参数,echo $0的结果是 echo,当 p小于10时可以不带花括号,否则必须带
$#:参数个数
$*$@:获取参数,其中前者以字符串的形式获取,后者是加引号,然后在引号中返回每个参数。假设在脚本运行时写了三个参数 1、2、3,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。

$?:上一个shell命令的返回状态码
$$:当前shell环境的进程ID号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
echo "-- \$* 演示 ---"
for i in "$*"; do
echo $i
done

echo "-- \$@ 演示 ---"
for i in "$@"; do
echo $i
done

# $ chmod +x test.sh
# $ ./test.sh 1 2 3
# -- $* 演示 ---
# 1 2 3
# -- $@ 演示 ---
# 1
# 2
# 3

间隔符

基本符号的用法

引号

单引号:将其中的内容全部作为字符串,忽略所有的命令和特殊字符
双引号:解析特殊字符,包括 ', ", $, \,如果需要输出这些字符,需要转义符
反引号:包含一个命令字符串的,其中的命令会先执行,如`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.
推荐阅读
正则表达式学习 正则表达式学习 【cpp查漏补缺】4-gdb的使用 【cpp查漏补缺】4-gdb的使用 【MIT6.172】学习笔记(1) 【MIT6.172】学习笔记(1)
 Comments