Linux文本处理和shell编程

目录:

1.Linux文本工具

1.1文本的处理工具

1.1.1 cut文本字段截取

格式:cut -d【间隔符】 -f【列号】 -c【字符】

-d : 指定分隔符类型

-f : 指定打印第几列

-c : 按字符分割,按照单个字符进行分割
	比如:abcdefg
		cut -c 2-4
		截取到的就是 bcd

[00:37:30root@localhost ~]# cat test 
NAME="Rocky Linux"
VERSION="8.5 (Green Obsidian)"
ID="rocky"
ID_LIKE="rhel centos fedora"
[00:37:35root@localhost ~]# cut -d "=" -f1  test #以=为分隔符,截取文件的第一列
NAME
VERSION
ID
ID_LIKE
####
[00:39:53root@localhost ~]# cut  -c 1-4 test  #通过指定字符数分割
NAME
VERS
ID="
ID_L

1.1.2 paste文本文件合并

格式:paste [参数] [文件1] [文件2]
常用选项:
-d: 自定义间隔符,默认为tab
-s:串行处理,非并行

[00:46:52root@localhost ~]# cat file1 file2
1111
2222
3333
4444
5555
6666
####
[00:46:59root@localhost ~]# paste -d"|" file1 file2 #合并文件指定分隔符为"|"
1111|4444
2222|5555
3333|6666
####
#注意paste是不会保存文件的
[00:47:47root@localhost ~]# cat file1
1111
2222
3333
[00:49:22root@localhost ~]# cat file2
4444
5555
6666
#####
[00:49:25root@localhost ~]# paste -d"|" file1 file2 >file3 #可以通过重定向的方式保存
[00:49:59root@localhost ~]# cat file3
1111|4444
2222|5555
3333|6666
[00:50:05root@localhost ~]# paste -d"|" -s file1 file2 #把每个文件当作一行合并
1111|2222|3333
4444|5555|6666

1.1.3 sort文件排序

格式:sort [参数]… [文件]
常用选项:
-t :分隔符
-n:按字符串数值排序
-r:倒叙排行
-u:去除重复的行
-k:指定从第列开始

[01:06:36root@localhost ~]# cat file1
1:22
7:232
8:453
1:22
8:453
333:686
2:24234
#####
[01:04:27root@localhost ~]# sort -t: -n -k2 file1 #指定分割符为":"号,对第二列排序
1:22
1:22
7:232
8:453
8:453
333:686
2:24234
######
[01:07:49root@localhost ~]# sort -u  file1 #去除重复的行
1:22
2:24234
333:686
7:232
8:453
####
[01:08:32root@localhost ~]# sort -t: -ur  file1 #去除和倒叙排行
333:686
8:453
2:24234
7:232
1:22

1.1.4 uniq文件去重

格式:uniq [参数]… [文件]
常用参数:
-c:在每列旁边显示该行重复出现的次数
-d:仅显示重复出现的行列
-u:仅显示出一次的行列

[01:18:12root@localhost ~]# cat file1 
1111
1111
3333
2222
2222
[01:18:19root@localhost ~]# uniq  -c file1 #去重显示次数
      2 1111
      1 3333
      2 2222
###
[01:18:27root@localhost ~]# uniq  -d file1 #仅显示重复的
1111
2222
####
[01:19:06root@localhost ~]# uniq  -u file1 #仅显示出一次的行列
3333

1.1.5 文本行数统计和文件相同比对

格式:wc [参数]… [文件]
常用参数:
-l:统计行号
格式:diff [文件]

[01:23:10root@localhost ~]# cat file1
1111
1111
3333
2222
2222
[01:23:14root@localhost ~]# wc -l file1 #统计行号
5 file1
####
[01:23:20root@localhost ~]# cat file1 |wc -l #支持标准输入
5
####
[01:24:37root@localhost ~]# cat file2
1111
1111q
3333
2222
2222q
[01:24:48root@localhost ~]# diff file1 file2 #对比文件的不同
2c2
< 1111
---
> 1111q
5c5
< 2222
---
> 2222q

1.2文本查找工具

1.2.1 locate

安装:
centos:yum install mlocate
ubuntu: apt-get install mlocate
格式:locate [文件]

[01:30:12root@localhost ~]# touch test1   
[01:30:26root@localhost ~]# locale test1 #找不到需要先创建或者更新数据库
locale: unknown name "test1"
[01:30:37root@localhost ~]# updatedb
[01:32:56root@localhost ~]# locate test1
/root/test1
####弊端不能查找新文件需要先更新数据库

1.2.2 find

格式:find [参数]… [文件]

-name   filename                 #查找名为filename的文件
-perm                            #按执行权限来查找
-user    username                #按文件属主来查找
-group groupname                 #按组来查找
-mtime   -n +n                   #按文件更改时间来查找文件,-n指n天以内,+n指n天以前
-atime    -n +n                  #按文件访问时间来查找文件,-n指n天以内,+n指n天以前
-ctime    -n +n                  #按文件创建时间来查找文件,-n指n天以内,+n指n天以前
-nogroup                         #查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser                          #查无有效属主的文件,即文件的属主在/etc/passwd中不存
-type    b/d/c/p/l/f             #查是块设备、目录、字符设备、管道、符号链接、普通文件
-size      n[c]                  #查长度为n块[或n字节]的文件
-mount                           #查文件时不跨越文件系统mount点
-follow                          #如果遇到符号链接文件,就跟踪链接所指的文件
-prune                           #忽略某个目路
-print                           #表示将结果输出到标准输出。
#按名字查找
在当前目录及子目录中,查找大写字母开头的txt文件 
 $ find . -name '[A-Z]*.txt'  
在/etc及其子目录中,查找host开头的文件 
$ find /etc -name 'host*'  
在$HOME目录及其子目录中,查找所有文件   
$ find ~ -name '*'
在当前目录及子目录中,查找不是out开头的txt文件   
$ find . -name "out*" -prune -o -name "*.txt"
 
#按照用户属主属组查找
按属主及属组   
查找属主是luo的文件   
find / -user luo -type f
查找属主被删除的文件 
find / -nouser -type f   
查找属组 mysql 的文件 
find / -group luo -type f  
查找用户组被删掉的文件 
find / -nogroup -type f
 #按照大小查找
查找超过1M的文件 
find / -size +1k -type f 
查找等于6字节的文件 
find . -size 6c #表示{5-6}字节
查找小于32k的文件 
find . -size -32k #表示{0-32k}
 

1.3文本处理三剑客

1.3.1 grep

-i:忽略大小写进行匹配
-v:反向查找,只打印不匹配的行
-n:显示匹配行的行号
-r:递归查找子目录中的文件
-l:只打印匹配的文件名
-c:只打印匹配的行数
-E:将模式视为扩展正则表达式来使用
-P:将模式视为 Perl 正则表达式来使用
-o:只显示匹配的部分
-m <num>:找到 num 行结果后停止查找,用来限制匹配行数
--color=auto:标记匹配的颜色

列举一部分

在文件 file.txt 中查找字符串 “hello”,并打印匹配的行:
[01:56:34root@localhost ~]# cat file.txt
hello niubi
wwww
aaa
[01:56:38root@localhost ~]# grep hello file.txt
hello niubi
在标准输入中查找字符串 “world”,并只打印匹配的行数:
[01:56:40root@localhost ~]# echo "hello world" | grep -c world
1
在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行。
[01:58:02root@localhost ~]# grep test *file
test
以递归的方式查找符合条件的文件。例如,查找指定目录 /etc/acpi 及其子目录(如果存在子目录的话)下所有文件中包含字符串 “luo” 的文件,并打印出该字符串所在行的内容,使用的命令为:
[01:59:39root@localhost ~]# grep -r luo /etc/acpi
/etc/acpi/lll.txt:luo
/etc/acpi/ll.txt:qqqqqluo
/etc/acpi/ll2.txt:q11qqqluo
[01:59:46root@localhost ~]# 
反向查找。前面各个例子是查找并打印出符合条件的行,通过 “-v” 参数可以打印出不符合条件行的内容。查找文件名中包含 test 的文件中不包含 test 的行,此时,使用的命令为:
[01:59:46root@localhost ~]# grep -v test *test*
test:NAME="Rocky Linux"
test:VERSION="8.5 (Green Obsidian)"
test:ID="rocky"
test:ID_LIKE="rhel centos fedora"

1.3.2 sed

-e:直接在命令行模式上进行 sed 动作编辑,此为默认选项
-f:将 sed 的动作写在一个文件内,用 -f filename 执行 filename 内的 sed 动作
-i:直接修改文件内容,而不是输出到标准输出
-n:只打印模式匹配的行
-r:支持扩展正则表达式
-h 或 --help:显示帮助信息
###
#常用字符
 a\ 在当前行下面插入文本
 i\ 在当前行上面插入文本
 c\ 把选定的行改为新的文本
 d 删除,删除选择的行
 D 删除模板块的第一行
 s 替换指定字符
 g 表示行内全面替换
 p 表示打印行
 

实例

替换文本中的字符串
sed 's/book/books/' file
-n选项和p命令一起使用表示只打印那些发生替换的行
sed -n 's/test/TEST/p' file
直接编辑文件选项-i
sed -i 's/book/books/g' file
#使用后缀 /g 标记会替换每一行中的所有匹配
删除文件的第2行
sed '2,$d' file
-e选项允许在同一行里执行多条命令
sed -e '1,5d' -e 's/test/check/' file
在 test.conf 文件第2行之后插入 this is a test line
sed -i '2a\this is a test line' test.conf
-r支持正则表达式
[02:00:06root@localhost ~]# echo aaa BBB | sed 's/\([a-z]\+\) \([A-Z]\+\)/\2 \1/' 
BBB aaa

1.3.2 awk

Awk程序是由一系列的pattern和action组成的,每一个pattern和action之间用大括号{}分隔,
表示当输入行匹配了pattern时,就执行对应的action。pattern可以是正则表达式
比较表达式或常量表达式,用于筛选输入行。action可以是一些常规的表达式或流程控制语句,用于处理输入行
常用选项:
-f: scripfile 从脚本文件中读取awk命令
-F: 默认的分隔符是连续的空格或制表符
-v:赋值一个用户定义变量。
格式:
program: pattern{action}
###
BEFIN{} #处理文件之前先执行
END{} #处理文件后1执行
支持逻辑运算
[16:42:00root@10 ~]#seq 10 |awk 'NR==2'
2
[16:45:03root@10 ~]#seq 10 |awk 'NR>=2 && NR<=4'
2
3
4
打印文件中的第一列和第三列,以空格分隔:
awk '{print $1, $3}' file.txt
以冒号为分隔符,打印文件中的第二列和最后一列,以逗号分隔:
awk -F: '{print $2, $NF}' file.txt
从1加到10
awk 'BEGIN {sum=0; for (i=1; i<=10; i++) sum+=i; print sum}'
awk 'BEGIN{sum=0;i=1;while(i<=100){sum+=i;let i++}print sum}'
取ip
[02:44:59root@localhost ~]# ip a|awk -F" +|\/" '/noprefixroute/{print $3}'
10.0.0.28
取出分区利用率
df |awk -F" +|%" 'NR>1{print $5}'
[03:02:45root@localhost ~]# df |awk -F"[ %]+" '/\/dev\/sd/{$5>10?disk="full":disk="ok";print $5,disk}'
3 ok
1 ok
21 full
#三目表达式
先用df命令输出所有的磁盘信息,然后用管道符|将结果传递给awk命令。
awk命令使用-F"[ %]+“来指定字段分隔符为一个或多个空格或百分号,然后对每一行进行匹配和处理。
如果一行中包含/dev/sd这个字符串,就执行大括号中的动作。
大括号中的动作是,根据第五个字段(即磁盘使用率)的值是否大于10,来给变量disk赋值为"full"或"ok”
然后打印第五个字段和disk变量的值

1.4文本格式化命令(printf)

printf “格式字符串” 参数

printf #不主动换行
% #预留字符的数,不够的字符自动对齐,默认是右对齐,-是左对齐
%s #字符
%d #整数
%f #小数
[19:02:59root@ubuntu ~]# awk -F":" '{printf "%20s|||%10s\n",$1,$3}' /etc/passwd
                root|||         0
              daemon|||         1
                 bin|||         2
                 sys|||         3
输出一个浮点数,保留两位小数,左对齐
[11:20:19root@localhost ~]# printf "%-.2f\n" 3.14159
3.14
###
[11:20:50root@localhost ~]# printf "%-5s %-10s %-4.2f\n" 01 Tom 90.3456
01    Tom        90.35
#左对齐预留五个,十个和预留四个取两位小数
--help 显示帮助信息
#####

2.正则表达式

2.1 基本正则表达式

什么是正则表达式:
定义正则表达式是你所定义的模式模板(pattern template),Linux工具可以用它来过滤文本。Linux工具(比如sed编辑器或grep程序)能够在处理数据时使用正则表达式对数据进行模式匹配。如果数据匹配模式,它就会被接受并进一步处理;如果数据不匹配模式,它就会被滤掉。

正则表达式是区分大小写的
. #匹配任意一个字符,但是不匹配/n
\ #转义符,后面的符号当作原意义 ,[]一样的效果;在[^]里面取反的意思
[EEEW] # 取里面任意一个内容
[:digit:] #表示数字
[:lower:] #表示任意小写字母
[:upper:] #表示任意大写字母
[:alnum:] #数字和字母
[:blank:] #空白字符
[:space:] #包括空格,制表符,换行符,回车符等,包含范围广
[^SKDA] #取反排除SKDA的文件
匹配次数
* #任意次数,a*,代表匹配n次a,也可以是零次
.* #匹配任意长度的任意字符;贪婪模式
\? #表示前面的一个字符可有可无
\+ #表示前面的一个字符出现的一次以上
\{n\} #表示前的的字符出现n次
\{m,n}\ #匹配前面的字符至少m次,最多n次
位置锚定
^ #行首
$ #行尾 ; ^$空行
\< #词首锚定
\> #词首锚定
\b #可以属于词首词尾
\(SADA\) #整体;\(SADA\) \(28424\) \(1231\) 可以表示多个分组 ; (\1表示SADA),(\2表示28424)在后面在出现,后向引用
a\|b #或a或b  12\(a\|b) #表示12a或者12b;12[ab] #表示12a或者12b

案例

[11:48:42root@localhost ~]# 
[11:48:42root@localhost ~]# cat linux.txt 
NAME="Rocky Linux"
VERSION="8.5 (Green Obsidian)"
ID="rocky"
ID_LIKE="rhel centos fedora"
VERSION_ID="8.5"
[11:49:03root@localhost ~]#  grep "rocky" linux.txt
ID="rocky" #匹配包含rocky的行
[11:49:10root@localhost ~]# grep "^ID" linux.txt
ID="rocky"
ID_LIKE="rhel centos fedora" #匹配ID开头的行
[11:49:57root@localhost ~]# grep "\"$" linux.txt
NAME="Rocky Linux"
VERSION="8.5 (Green Obsidian)" #匹配以"结尾的行
ID="rocky"
ID_LIKE="rhel centos fedora"
VERSION_ID="8.5"
[11:50:00root@localhost ~]# grep "ID.*r" linux.txt
ID="rocky"
ID_LIKE="rhel centos fedora" #匹配包含ID和r的行
[11:54:07root@localhost ~]# grep "[[:digit:]]" linux.txt
VERSION="8.5 (Green Obsidian)" #匹配包含数字的行
VERSION_ID="8.5"
[11:57:03root@localhost ~]# grep "e\{2\}" linux.txt
VERSION="8.5 (Green Obsidian)" #表示"e"字符至少出现过两次

2.1 扩展正则表达式

[EEEW] # 取里面任意一个内容
[:digit:] #表示数字
[:lower:] #表示任意小写字母
[:upper:] #表示任意大写字母
[:alnum:] #数字和字母
[:blank:] #空白字符
[:space:] #包括空格,制表符,换行符,回车符等,包含范围广
[^SKDA] #取反排除SKDA的文件
匹配次数
* #任意次数,a*,代表匹配n次a,也可以是零次
.* #匹配任意长度的任意字符;贪婪模式
? #表示前面的一个字符可有可无
+ #表示前面的一个字符出现的一次以上
{n} #表示前的的字符出现n次
{m,n} #匹配前面的字符至少m次,最多n次
位置锚定
^ #行首
$ #行尾 ; ^$空行
\< #词首锚定
\> #词首锚定
\b #可以属于词首词尾
a|b #或a或b  12\(a\|b) #表示12a或者12b;12[ab] #表示12a或者12b

案例

[12:07:43root@localhost ~]# ip a|grep "\<noprefixroute\>" #取出带有"noprefixroute"字符的行
    inet 10.0.0.28/24 brd 10.0.0.255 scope global noprefixroute eth0
####
[12:17:26root@localhost ~]# ip a |grep '\<noprefixroute\>'|grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'|head -1
10.0.0.28 #取出ip
####
[12:25:14root@localhost ~]# df |grep '^\/dev\/'|tr -s ' ' %| cut -d% -f5|sort -r
3
21
1
#取出分区利用率
[12:27:01root@localhost ~]# df |grep '^\/dev'|grep -oE '[0-9]{1,3}%'|grep -Eo '[0-9]+'
3
1
21 
#取出分区利用率
[12:30:24root@localhost ~]# grep -E 'root|bash' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
luo:x:1000:1000:luo:/home/luo:/bin/bash
#取出带有root或者bash的行

3.linux变量

Linux中变量的命名规则如下:

变量名只能包含字母(a-z或A-Z)、数字(0-9)或下划线(_)。
变量名不能以数字开头。
变量名不能包含空格或特殊字符。
变量名区分大小写。
环境变量的名字通常用大写字母。
Linux中不同类型的变量有不同的作用和用法,以下是一些常见的例子34:

3.1 环境变量

环境变量(environment variables)是在系统范围内有效并被所有子进程和shell继承的变量。它们可以用来存储一些系统或应用程序的设置或行为,例如默认的文本编辑器或浏览器,可执行文件的路径,或者系统的语言和键盘布局等。可以使用export命令来设置环境变量,例如:export LANG=zh_CN

3.2 位置变量

位置变量(positional parameters)是在shell脚本或函数中使用的变量,它们表示命令行参数。位置变量的名字是由一个或多个数字组成的,除了0以外。位置变量N可以用$ {N}或$N来引用,当N只有一位数时。位置变量0表示实际的命令、程序、shell脚本或函数的名字。位置变量1, 2, 3,…9表示命令的参数。可以使用set和shift命令来设置和取消位置变量,例如:
set – a b c # 设置位置变量为a, b, c
echo $1 # 输出a
shift # 移动位置变量,$1变为b,$2变为c
echo $1 # 输出b

3.3 只读变量

只读变量(read-only variables)是不能被重新赋值的变量。只读变量可以用来防止一些变量被意外修改或删除。可以使用readonly命令来设置只读变量,例如:
readonly PI=3.14 # 设置PI为只读变量
PI=3.15 # 试图修改PI的值,会报错

3.4 局部变量

局部变量(local variables)是只在当前shell实例中有效的变量。它们不会被子进程或shell继承。局部变量可以用来存储一些临时的值或数据。可以使用local命令来设置局部变量,但只能在函数中使用,例如:
func () {
local x=10 # 设置x为局部变量
echo $x # 输出10
}
func # 调用函数
echo $x # 输出空值,因为x不在当前shell中

3.5 状态变量

状态变量(status variables)是一些特殊的变量,它们表示一些系统或shell的状态或信息。状态变量的名字通常以$开头,例如:
echo $? # 输出上一个命令的退出状态,0表示成功,非0表示失败
echo $$ # 输出当前shell的进程ID
echo $! # 输出最近一个后台进程的进程ID
echo $# # 输出位置参数的个数
echo $
# 输出所有位置参数的值
echo $@ # 输出所有位置参数的值,但是每个参数都被双引号括起来

4.shell基础

Linux中最常用的Shell是Bash,它是Bourne Shell的一个增强版。Bash可以在Mac OS和Windows的Cygwin中也可以使用。Bash的脚本文件通常以.sh为扩展名,需要有可读和可执行的权限才能运行。Bash的脚本文件的第一行通常是:沙邦机制

#!/bin/bash
#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。

案例1:

通过shell编程完成,30鸡和兔的头,80鸡和兔的脚,分别有几只鸡,几只兔?

#!/bin/bash

# 定义变量
heads=$1 # 头数,从命令行参数获取
legs=$2 # 脚数,从命令行参数获取
chickens=0 # 鸡的数量,初始为0
rabbits=0 # 兔的数量,初始为0

# 判断输入是否合法
if [ $heads -le 0 ] || [ $legs -le 0 ] || [ $(($legs % 2)) -ne 0 ]; then
  echo "输入不合法,请输入正整数,并且脚数为偶数。"
  exit 1
fi

# 计算鸡和兔的数量
for ((i=0; i<=$heads; i++)); do
  chickens=$i # 假设鸡的数量为i
  rabbits=$(($heads - $i)) # 假设兔的数量为头数减去i
  if [ $(($chickens * 2 + $rabbits * 4)) -eq $legs ]; then # 如果鸡和兔的脚数等于给定的脚数
    echo "鸡有$chickens只,兔有$rabbits只。" # 输出结果
    exit 0 # 退出程序
  fi
done
echo "无解。"

案例2:

#!/bin/bash
# 定义变量
user_prefix="user" # 用户名的前缀
# 循环遍历1..100
for i in {1..100}; do
  # 拼接用户名
  user_name="$user_prefix$i"
  # 判断用户是否存在
  if id "$user_name" &>/dev/null; then
    # 用户存在,输出提示信息
    echo "用户$user_name已存在。"
  else
    # 用户不存在,添加用户
    useradd "$user_name"
    # 输出提示信息
    echo "用户$user_name已添加。"
  fi
done

5.磁盘存储术语

head(磁头):是磁盘驱动器中用来读写数据的部件,它可以在磁盘表面上移动,选择不同的track(磁道)
track(磁道):是磁盘表面上的一个圆形环,它由一个固定的head(磁头)在磁盘旋转时读写的数据组成
sector(扇区):是track(磁道)上的一个子区域,它是磁盘存储的最小单元,通常为512字节或4096字节12。每个sector(扇区)都有一个独立的地址,用来定位数据3
cylinder(柱面):是由所有磁盘表面上相同位置的track(磁道)组成的一个圆柱体,它是磁盘寻道的单位12

6.MBR,GPT结构

MBR

MBR(主引导记录)是一种较旧的磁盘类型,它在磁盘的第一个扇区(LBA 0)存储了主引导代码,磁盘分区表,和引导签名。MBR的分区表只能包含最多四个主分区,或者三个主分区和一个扩展分区。MBR的分区表只能使用32位的逻辑块地址(LBA),因此MBR的磁盘最大只能支持2TiB(≈2.2TB)的容量1

GPT

GPT(全局唯一标识分区表)是一种较新的磁盘类型,它是UEFI(统一可扩展固件接口)标准的一部分。GPT在磁盘的第一个扇区(LBA 0)存储了一个保护性的MBR,用来兼容一些旧的系统或工具。GPT的真正分区表在磁盘的第二个扇区(LBA 1)开始,称为GPT头,它包含了磁盘的基本信息和分区表的位置。GPT的分区表可以包含最多128个分区,每个分区都有一个全局唯一标识(GUID)。GPT的分区表可以使用64位的逻辑块地址(LBA),因此GPT的磁盘最大可以支持8ZiB(≈9.4ZB)的容量2。

两者区别

MBR和GPT的结构决定了它们在其他方面也有不同。基于结构和技术,MBR和GPT的磁盘主要在以下几个方面有区别:

  1. 支持的启动模式:MBR的磁盘只能使用传统的BIOS(基本输入输出系统)来启动,而GPT的磁盘可以使用UEFI(统一可扩展固件接口)来启动。UEFI提供了更多的安全和性能的优势,例如安全启动,快速启动等
  2. 兼容的操作系统:MBR的磁盘可以兼容几乎所有的操作系统,包括Windows,Linux,macOS等。GPT的磁盘只能兼容一些较新的操作系统,例如Windows 10,Windows 8,Windows 7 64位,Linux,macOS等
  3. 分区的数量和大小:MBR的磁盘最多只能有四个主分区,或者三个主分区和一个扩展分区。每个分区的最大大小为2TiB(≈2.2TB)。GPT的磁盘最多可以有128个分区,每个分区的最大大小为8ZiB(≈9.4ZB)

7.分区管理

fdisk

fdisk命令的基本语法如下:
fdisk [选项] [设备]
选项:
-l:列出所有的分区表或指定设备的分区表。
-s:显示指定分区的大小,单位为块。
-u:使用扇区为单位,而不是柱面。
-v:显示版本信息。
###
m:显示菜单和帮助信息。
d:删除一个分区。
l:列出已知的分区类型。
n:添加一个新的分区,可以选择主分区,扩展分区或逻辑分区,以及分区的大小和位置。
p:打印分区表,显示分区的编号,起始和结束位置,大小,类型和标志。
q:退出不保存修改。
t:改变一个分区的类型,可以输入分区编号和类型代码,或者使用L查看可用的类型代码。
u:改变显示或输入的单位,可以选择柱面或扇区。
v:验证分区表,检查是否有错误或不一致。
w:写入分区表到磁盘并退出,会保存修改。
MBR(主引导记录)类型的分区表最多只能有四个主分区,或者三个主分区和一个扩展分区。
扩展分区可以包含多个逻辑分区,但逻辑分区不是主分区

案例

[13:57:04root@localhost ~]# fdisk /dev/sdb 

Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0xc6c7ad05.

Command (m for help): n
#n创建新分区
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
#选择分区类型
Partition number (1-4, default 1): 1 #选择分区序号
First sector (2048-41943039, default 2048):  #起始扇区
Last sector, +sectors or +size{K,M,G,T,P} (2048-41943039, default 41943039): +5G #分区多少
Command (m for help): p
Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xdf4d7af5

Device     Boot Start      End  Sectors Size Id Type
/dev/sdb1        2048 10487807 10485760   5G 83 Linux
#查看分区信息

parted

parted用于对磁盘(或RAID磁盘)进行分区及管理,与fdisk分区工具相比,支持2TB以上的磁盘分区,并且允许调整分区的大小

$ parted /dev/sdb
# 对/dev/sdb进行分区或管理操作
 GNU Parted 3.1
使用 /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
 (parted) mklabel gpt
# 定义分区表格式(常用的有msdos和gpt分区表格式,msdos不支持2TB以上容量的磁盘,所以大于2TB的磁盘选gpt分区表格式)
 警告: The existing disk label on /dev/sdb will be destroyed and all data on this disk will be lost. Do you want to continue?
# /dev/sdb上现有的磁盘标签将被销毁,该磁盘上的所有数据将丢失。你想要继续
是/Yes/否/No? yes                                                         
 (parted) mkpart p1
# 创建第一个分区,名称为p1(p1只是第一个分区的名称,用别的名称也可以,如part1)
 文件系统类型?  [ext2]? xfs        
# 定义分区格式(不支持ext4,想分ext4格式的分区,可以通过mkfs.ext4格式化成ext4格式)
起始点? 1       
# 定义分区的起始位置(单位支持K,M,G,T)
结束点? 100%   
# 定义分区的结束位置(单位支持K,M,G,T)    
(parted) print   # 查看当前分区情况
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 107GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 
 
Number  Start   End    Size   File system  Name  标志
 1      1049kB  107GB  107GB  xfs          p1

mkfs

mkfs #是一个用来创建文件系统的命令行工具,它可以支持多种文件系统类型,如ext2, ext3, ext4, xfs, btrfs等
-V:详细显示模式
-t:给定档案系统的型式,Linux 的预设值为 ext2
###案例
#将sdb分区格式化为ext4格式
[14:24:52root@localhost ~]# mkfs -t ext4 /dev/sdb1
mke2fs 1.45.6 (20-Mar-2020)
Creating filesystem with 1310720 4k blocks and 327680 inodes
Filesystem UUID: 503fc61b-2bc7-4cd9-b0c1-7de256e13f4d
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

mount

-t vfstype:指定文件系统的类型,通常不必指定。mount会自动选择正确的类型
-o options:主要用来描述设备或档案的挂接方式。常用的参数有:loop(用来把一个文件当成硬盘分区挂接上系统),ro(采用只读方式挂接设备),rw(采用读写方式挂接设备),iocharset(指定访问文件系统所用字符集)等
#是一个用来挂载文件系统到目录的命令行工具,它可以指定文件系统的类型,选项,标签,UUID等
#未挂载的分区是不可用的
[14:27:32root@localhost ~]# mount /dev/sdb1 /mnt
#挂载的分区,挂载点
umount #是一个用来卸载已挂载的文件系统的命令行工具,它可以指定文件系统的设备名或挂载点。
-f:强制卸载,即使文件系统处于忙碌状态
-l:延迟卸载,等待文件系统变为空闲状态后再卸载
通过设备名卸载文件系统,同时输出详细信息:
umount -v /dev/sdb1
通过挂载点卸载文件系统:
umount -v /mnt/
如果设备正忙,卸载即告失败。卸载失败的常见原因是,某个打开的shell当前目录为挂载点里的某个目录。这种情况下,可以退出目录后再卸载,或者执行延迟卸载2:
umount -vl /mnt/

swapon

#swapon是Linux中的一个命令,用于激活Linux系统中的交换空间12。Linux系统的内存管理必须使用交换区来建立虚拟内存
-a:将/etc/fstab文件中所有设置为swap的设备,启动为交换区;
-v:显示详细信息;
-p <优先顺序>:指定交换区的优先顺序;
-s:显示交换区的使用状况
[14:29:28root@localhost ~]# swapon -s
Filename				Type		Size	Used	Priority
/dev/sda3                              	partition	2097148	0	-2
#禁用swap
[14:44:04root@localhost ~]# swapon -s
[14:44:06root@localhost ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:          1.7Gi       427Mi       1.0Gi       8.0Mi       352Mi       1.2Gi
Swap:            0B          0B          0B
[14:41:48root@localhost ~]# swapon -a
#启动用swap

其他命令

#查看分区的详细信息
tune2fs
14:24:58root@localhost ~]# tune2fs -l /dev/sdb1
#查看xfs文件系统的信息
xfs_info 挂载点
fsck #可以修复逻辑卷,但是基本修复不好
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值