帮助
man
man 是 manual 的缩写
man 帮助用法演示:
man ls
man 也是一条命令,分为 9 章,可使用 man 命令获得 man 的帮助
查看 man 命令的第 7 章:
man 7 man
命令帮助:
man 1 passwd
配置文件帮助(/etc/passwd):
man 5 passwd
查看全部帮助(不知道是命令还是配置文件,适用于相似查找)
man -a passwd
help
shell(命令解释器)自带的命令称为内部命令,其他的是外部命令
如何区分内外部命令?
type 命令
type cd
内部命令使用help帮助:
help cd
外部命令使用 命令 –help 帮助:
ls --help
whatis
命令简短介绍
whatis cp
info
info帮助比help更详细,作为help的补充
info ls
apropos
检索命令关键字
例如:不记得tcpdump命令的全名:
apropos tcp
#等价于
man -k tcp
文件和目录
删除和创建
touch
创建空文件
touch file1.txt #创建空文件
touch file2.txt file2.doc #创建两个空文件
touch "program files" #文件名含空格,但非常不建议文件或目录名中包含空格
mkdir
创建文件夹
mkdir dir
mkdir dir1 dir2
mkdir -p dir #递归创建,强烈建议脚本中使用此选项
rm
删除文件或目录
选项 | 含义 |
---|---|
-r | 删除目录 |
-f | 强制执行 |
rm -rf /root/test/ #强制删除/root/test/目录
rm file #删除文件file
rmdir
删除空目录,非空目录使用 rm -r
删除
rmdir dir
mv
移动 & 重命名 目录或文件
mv [源目录或文件] [目标目录或文件]
mv file1 file2 #将文件 file1 重命名为 file2
mv dir1 dir2 #将目录 dir1 重命名为 dir2(当前目录下不存在 dir2 目录)
mv file dir #将文件 file 移动到 dir 目录内
mv dir dir1 #将目录 dir 移动到 dir1 目录内 (当前目录下存在 dir1 目录)
cp
复制
选项 | 含义 |
---|---|
-r 或 -R | 递归复制目录及其子目录内的所有内容 |
-p | 保留权限、属主和修改时间 |
-v | 显示复制过程 |
-a | 等同于-dpR |
-d | 复制符号连接,而不是指向的文件 |
cp file file.bak #创建 file 的一个副本到当前目录下,名字为 file.bak
cp file dir #将 file 复制一份到 dir 目录内
cp -r dir1 dir2 #目录 dir1 复制到 dir2 目录内
ln
链接命令
ln -s [源文件或目录] [目标文件或目录] 创建软链接
ln [源文件] [目标文件] 创建硬链接
软连接:相当于【快捷方式】
硬链接:类似于复制,同步更新,i节点和源文件相同;通过i节点识别,不能跨分区,不能针对目录使用
目录操作
ls
列出目录中的内容
选项 | 含义 |
---|---|
-h | 人性化显示大小 |
-a | 显示隐藏文件 |
-d | 目录属性 |
-i | inode i节点信息 |
-l(小写L) | 详细信息 |
-1 | 一列显示 |
-s | 显示大小 |
-r | 逆序显示 |
-t | 按时间顺序显示 |
-R | 递归显示 |
ls -lh #列出当前目录下的详细信息,并人性化显示大小
ls -a #显示当前目录下的隐藏文件
cd
切换目录
cd . #切换到当前目录
cd .. #切换到上级目录
cd ~ #切换到用户家目录
cd - #切换到原来的目录
cd /root #切换到 /root 目录下
pwd
显示当前目录绝对路径
tree
树状结构显示目录
tree -L 1 #仅显示当前目录下的一级子目录
tree -d #仅显示目录
du
显示目录大小
du -sh /root #显示当前目录大小
文件操作
stat
显示文件的 inode 内容
stat file1
rename
重命名
rename 源字符串 目标字符串 文件
# 将 name1.txt 重名名为 name.txt
rename name1.txt name.txt name1.txt
支持的通配符
通配符 | 含义 |
---|---|
? | 可替代单个字符 |
* | 可替代多个字符 |
[char] | 可替代char集合中的任意单个字符 |
假设当前文件夹中有name1,name2 …, name9, name10, …, name299
rename name name0 name?
# 将 name1 到 name9 重命名为 name01 到 name09,即将匹配到的字串(name加任意1个字符)中的name替换为name0
rename name name0 name??
# 将 name01 到 name99 重命名为 name001 到 name099,即将匹配到的字串(name加任意2个字符)中的name替换为name0
rename name name0 name*
# 将 name001 到 name299 重命名为 name0001 到 name0299,即将匹配到的字串(以name开头)中的name替换为name0
rename name0 name name0[12]*
# 将 name0100 到 name0299 重命名为 name100 到 name299,即将匹配到的字串(以name0,后一个字符为1或2开头)中的name0替换为name
正则表达式(Perl 版)(查看方法:rename -V ;util-linux 为非 Perl 版)
prename "s/AA/aa/" *
# 把文件名中的AA替换成aa
prename "s/.html/.php/" *
# 把 .html 后缀的改成 .php 后缀
prename "s/$/.txt/" *
# 把所有的文件名都改成以 .txt 结尾
prename "s/.txt//" *
# 把所有以 .txt 结尾的文件名的 .txt 去掉
basename
获取文件名
basename /root/test.txt # 提取文件名
test.txt
basename -s .txt /root/test.txt #提取文件名并去掉后缀
test
dirname
获取路径名
dirname /root/test.txt
/root
file
查看文件类型
file aaa.txt
md5sum
计算文件 md5 值
md5sum file # 计算 md5 校验值
echo "8fddaad2cac641f6abd3f79cd6ad6da5 file" | md5sum -c # 校验 md5 值
sha256sum
计算文件 sha256 值
sha256sum file # 计算 sha256 校验值
echo "d0cada789ec90f5a65f2bcdbacb369ddb114a0e3f18648f4be27f3c987d94606 file" | sha256sum -c # 校验 sha256 值
查找
find
文件搜索
find [搜索路径] [匹配条件]
参数 | 含义 |
---|---|
-cmin | 文件属性改变,单位分钟 |
-amin | 访问时间改变,单位分钟 |
-mmin | 文件内容变化时间,单位分钟 |
-ctime | 文件属性改变,单位天 |
-atime | 访问时间改变,单位天 |
-mtime | 文件内容变化时间,单位天 |
-type | 基于文件类型;f 文件,d 目录,l 软连接; |
-inum | 根据i节点查找 |
-iname | 文件名忽略大小写 |
-size | 根据大小查找,默认单位为1个数据块(0.5KB);支持k(KiB),M(MiB),G(GiB) |
-user | 查找所属用户 |
-regex | 正则表达式 |
-iregex | 忽略大小写的正则表达式 |
-perm | 查找权限 |
-a | 两个条件同数满足 |
-o | 满足一个即可 |
-exec | 找到文件后执行后续操作 |
-ok | 找到文件后执行后续操作,但需确认 |
find /etc -name init #查找文件名为init
find /etc -name *init* #查找文件包含init
find /etc -type d -name rc* #查找/etc下 rc开头的文件夹
find /etc -iname init #查找文件init(忽略大小写)
find /etc -size +204800 #查找大于100MB的文件,默认单位为数据块,1数据块=0.5KB
find /etc -size +10M #查找大于10MB的文件
find /etc -user abc #查找属于abc用户的文件
find /etc -cmin -5 #查找5分钟内修改过属性的文件,+5表示超过5分钟
find / -perm -0777 #查找权限为777的文件
find /etc -name inittab -exec ls -l {} \; #将找到的文件执行 ls -l 操作
find -inum 2629483 -exec rm {} \; #根据i节点来删除文件,适用于特殊文件名
find / -perm -4000 -o -perm -2000 #查找系统中具有UID权限的文件
which
查找命令路径,是否有别名
which rm
whereis
查找命令路径,及帮助文档
whereis ls
locate
基于索引的搜索,速度比 find 快,但实时性不如 find
locate [文件名]
选项 | 含义 |
---|---|
-i | 忽略大小写 |
locate file # 全盘搜索 file
updatedb # 更新索引
/tmp 不在索引范围内
文件权限
chown
用法 | 含义 |
---|---|
chown [用户] [文件或目录] | 改变所有者,只有root可以改所有人 |
chown [:组名] [文件或目录] | 改变所属组 |
chown [用户名:组名] [文件或目录] | 同时改变所属组和所有者 |
chown test file1 # 将 file1 的所属者改为 test
chown :test file1 # 将 file1 的所属组改为 test
chown test:test file1 # 将 file1 的所属者改为 test,所属组改为 test
chgrp
改变所属组
chgrp test file1 # 将 file1 的所属组改为 test
chmod
修改文件或目录权限
chmod [{ugoa}{+-=}{rwx}] [文件或目录]
选项 | 含义 |
---|---|
u | 所有者 |
g | 所属组 |
o | 其他人 |
a | 所有 |
+ | 增加 |
- | 移除 |
= | 指定 |
r | 读(4),可以查看文件内容,列出目录中的内容 |
w | 写(2),可以修改文件内容,可以在目录中创建、删除文件 |
x | 执行(1),可以执行文件,可以进入目录 |
-R | 递归修改 |
chmod g+w,o-r filename # 将 filename 所属组增加写权限,其他人去掉读权限
chmod u+x filename # 将 filename 所有者增加执行权限
chmod 644 filename # 将 filename 权限指定为:所有者可读写,所属组和其他人为只读,但所有人都不可执行
chmod u+s filename # 将 filename 增加 SUID 权限,即执行该文件权限变为root
chmod u-s filename # 将 filename 去掉 SUID 权限
chmod g+s filename # 将 filename 增加 SGID 权限,即执行该文件时权限变为该文件的所属组
chmod g+s dirname # 将 dirname 增加 SGID 权限,即其他用户在此目录创建的文件属组为该目录的属组
chmod g-s filename # 将 filename 去掉 SGID 权限
chmod o+t dirname # 将 dirname 增加 SBIT 粘着位权限,即用户对该目录下的所有文件都有写权限,但只能删除此目录下自己创建的文件,而无法删除其他用户创建的文件。
chmod o-t dirname # 将 dirname 去掉 SBIT 粘着位权限
chattr
设置文件系统属性
chattr [+-=] [选项] 文件或目录名
选项 | 含义 |
---|---|
+ | 增加权限 |
- | 删除权限 |
= | 等于某权限 |
i(文件) | 不允许对文件进行删除、改名,也不能添加和修改数据 |
i(目录) | 只能修改目录下文件的数据,但不允许建立和删除文件 |
a(文件) | 只能在文件中增加数据,但是不能删除也不能修改数据 |
a(目录) | 只允许在目录中建立和修改文件,但是不允许删除 |
chattr +i filename # 对 filename 增加i权限
lsattr
查看文件系统属性
lsattr 选项 文件名
选项 | 含义 |
---|---|
-a | 显示所有文件和目录,含隐藏文件 |
-d | 若目标是目录,仅列出目录本身的属性,而不是子文件的 |
lsattr filename # 显示 filename 的文件系统属性
setfacl
设置文件 ACL 权限
setfacl [选项] [文件或目录名]
选项 | 含义 |
---|---|
-m | 设定ACL权限 |
-x | 删除指定的ACL权限 |
-b | 删除所有的ACL权限 |
-d | 设定默认ACL权限 |
-k | 删除默认ACL权限 |
-R | 递归设定ACL权限 |
设定用户 ACL 权限
setfacl -m u:用户名:权限 文件名或目录名
setfacl -m u:test:rx dir/ # 设置 test 用户只可查看 dir 目录内的文件,但不可删除、创建或修改目录内的文件
设定用户组 ACL 权限
setfacl -m g:组名:权限 文件名或目录名
setfacl -m g:test:rwx dir # 设置 test 组对 dir 目录拥有全部权限
其他用法
setfacl -m m:rx 文件名或目录名 # 设置指定文件的最大有效权限
setfacl -x u:用户名 文件名或目录名 # 删除指定用户对指定文件或目录的全部 ACL 权限
setfacl -x g:组名 文件名或目录名 # 删除指定用户组对指定文件或目录的全部 ACL 权限
setfacl -b 文件名或目录名 # 删除指定文件或目录的所有 ACL 权限
setfacl -m u:用户名:权限 -R 目录名 # 设定指定目录下的所有文件的 ACL 权限
setfacl -m d:u:用户名:权限 目录名 # 设定指定目录的默认 ACL 权限,即该目录下后建的文件都遵循此权限,再此之前设置的权限不受影响
getfacl
查看文件 ACL 权限
getfacl filename # 查看 filename 的 ACL 权限
压缩 / 解压缩
gzip
gzip -d xxx.gz 解压gz压缩包,默认删除源文件
gunzip xxx.gz 解压gz压缩包
gzip [文件] *.gz 压缩文件,只能压缩文件
gzip -d file.gz # 解压 file.gz ,并删除 file.gz
gzip file file.gz # 将 file 压缩为 file.gz, 并删除源文件 file
tar
选项 | 含义 |
---|---|
-f | 指定压缩文件名 |
-c | 创建打包 |
-z | 压缩(*.tar.gz) |
-v | 显示详细信息 |
-j | 压缩(*.tar.bz2) |
-C | 解压路径 |
tar -cvf file.tar file # 将 file 打包成 file.tar
tar -cvf dir.tar dir/ # 将 文件夹 dir 打包成 dir.tar
gzip file.tar file.tar.gz # 将 file.tar 压缩成 file.tar.gz
tar -czvf dir.tar.gz dir # 将以上两步合并,打包并压缩 dir 目录
tar -czvf file.tar.gz file1 file2 file3 # 将多个文件打包并压缩成 file.tar.gz
tar -xzvf file.tar.gz # 将 file.tar.gz 解压缩并解包
tar -xzvf file.tar.gz -C /root # 将 file.tar.gz 解压缩并解包到 /root 目录下
tar -cjvf dir.tar.bz2 dir/ # 将 dir 打包压缩成 file.tar.bz2
tar -xjvf dir.tar.bz2 # 将 dir.tar.bz2 加压缩并解包
tar -xvf file.tar.xz # 将 file.tar.xz 解压缩并解包
xz file.tar # 将 file.tar 包 压缩为 file.tar.xz,并删除 file.tar
zip / unzip
zip -r *.zip [文件或目录] 压缩文件或目录为zip
unzip *.zip 解压zip文件
zip -r file.zip file # 将 file 压缩成 file.zip
unzip file.zip # 将 file.zip 解压缩
bzip2 / bunzip2
bzip2 file # 将 file 压缩为 file.bz2, 并删除 file
bzip2 -k file # 将 file 压缩为 file.bz2, 不删除 file
bunzip2 file.bz2 # 将 file.bz2 解压缩
文本处理
查找文本内容
grep
查找文件内字符串
grep 选项 文件名
选项 | 含义 |
---|---|
-i | 忽略大小写 |
-v | 排除字符串 |
-E | 正则表达式 |
-n | 显示源文件行数 |
-w | 显示全匹配 |
-c | 显示匹配的行数 |
-A | 显示匹配行之后的内容行数 |
-B | 显示匹配行之前的内容行数 |
-C | 显示匹配行之前和之后的内容行数 |
-q | 不显示任何信息 |
-a | 不要忽略二进制数据 |
-o | 只显示匹配到的字符 |
grep 111 file # 匹配 file 中包含 111 的行
grep -i ac file # 匹配 file 中包含 ac、AC、Ac、aC 的行,忽略大小写
grep -v aa file # 匹配 file 中不包含 aa 的行
grep -E "aa|bb" file # 匹配 file 中包含 aa 或 bb 的行
grep -A 2 aa file # 匹配 file 中包含 aa 的行及其后2行(不含aa所在行)
查看文本内容
cat
显示文本
选项 | 含义 |
---|---|
-n | 显示行号 |
cat filename
more
分页显示文本
按键 | 含义 |
---|---|
空格 或 f | 向下翻页 |
回车 | 换行 |
q | 退出 |
more filename
less
显示文本
按键 | 含义 |
---|---|
空格 或 f | 向下翻页 |
b | 向上翻页 |
k 或 ↑ | 向上一行 |
j 或 ↓ | 向下一行 |
/string | 向下搜索 string 字符 |
?string | 向上搜索 string 字符 |
q | 退出 |
less filename
head
查看文本开头
head -n 7 filename # 查看 filename 的前7行
tail
查看文件结尾
参数 | 含义 |
---|---|
-n | 查看文本后几行 |
-f | 动态显示文本,适用于实时查看日志 |
tail -fn 6 filename # 实时显示 filename 最后6行
tac
倒叙显示文本
tac filename # 倒叙显示filename
文本处理
cut
字段提取
选项 | 含义 |
---|---|
-f | 提取列号 |
-d | 指定分隔符,不指定默认为制表符 |
-c | 按字符提取 |
准备以下文本 filename(456 和 abc 之间为制表符):
123 = 456 abc
cut -f 2 filename # 使用默认制表符作为分隔符,提取 filename 的第2列
结果:abc
cut -f 1 -d "=" filename # 使用"="作为分隔符,提取 filename 的第1列
结果:123
cut -c 1-5 filename # 提取 filename 的第1到5个字符
结果:123 =
sed
对数据流进行 选取、替换、删除、新增
sed的基本工作方式是:
- 将文件以行为单位读到内存(模式空间)
- 使用sed的每个脚本对该行进行操作
- 处理完成后输出该行
sed语法
sed [选项] '[动作]' 文件名
选项 | 含义 |
---|---|
-n | 一般会把所有数据都输出到屏幕,如果加入此选择,则只会把经过sed处理的行输出到屏幕 |
-e | 允许对输入数据应用多条sed命令编辑 |
-i | 用sed的修改结果直接修改读取数据的文件,而不由屏幕输出 |
-r | 支持扩展正则表达式 |
动作 | 含义 |
---|---|
a | 追加,在当前行后添加一行或多行。添加多行时,除最后一行外,每行末尾需要用“\”代表数据未完结。 |
c | 行替换,用c后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾需用“\”代表数据未完结。 |
i | 插入,在当期行前插入一行或多行。插入多行时,除最后一行外,每行末尾需要用“\”代表数据未完结。 |
d | 删除,d指令后的语句不会被执行 |
p | 打印,输出指定的行。与-n配合只输出匹配行 |
s | 字串替换,用一个字符串替换另外一个字符串。格式为“行范围s/旧字串/新字串/g”(和vim中的替换格式类似)。 |
g | 全局替换,用于替换所有出现的次数 |
’s/old/new/2’ | 替换第2次匹配 |
w path/to/file | 替换的行输出到文件,sed -n ‘s/old/new/w /tmp/a.txt’ |
= | 打印行号 |
r | 读取文件 |
w | 写文件 |
n | 读下一行命令,一般只处理偶数行,跳过奇数行 |
q | 退出,sed 10q filename #读取10行退出 |
sed -i '/string/d' filename # 删除string所在行
sed -i 's/string/d' filename # 删除string字串
sed -i '/string/a\new_string_line' filename # 在filename中查找string在其后插入new_string_line字符行
sed '/ab/a ccc' filename # 在ab字串后增加ccc新行
sed '/ab/c ccc' filename # 替换ab字串所在行为ccc
sed '/ab/r bfile' afile # afile中查找到ab字串后在其后插入bfile文件中的内容
sed -i 's/:$//g' filename # 去除“:”结尾的“:”
sed -i 's/\r//g' filename # 去除\r回车符,用于CRLF转换成LF格式
# 多次替换
sed -e 's/old/new/' -e 's/old/new/' filename …
sed -e 's/old/new/;s/old/new/' filename …
sed 's/正则表达式/new/' filename
sed -r 's/扩展正则表达式/new/' filename
# 同时匹配两个正则需使用()
sed -r 's/(aa)|(bb)/!/' filename
# 分组回调功能,“\1”表示回调第1组
echo axyzb | sed -r 's/(a.*b)/\1:\1/'
# 输出:axyzb:axyzb
# "/"与匹配内容冲突可以使用其他符号,原/分隔符使用!或@
sed 's!/!new!' filename
寻址
默认对每行进行操作,增加寻址后对匹配的行进行操作
/正则表达式/s/old/new/g
行号范围/s/old/new/g
行号可以是具体的行,也可以是最后一行$符号
可以使用两个寻址符号,也可以混合使用行号和正则地址
分组
寻址可以匹配多条命令
/regular/{s/old/new/;s/old/new/ }
脚本文件
可以将选项保存为文件,使用-f 加载脚本文件
sed -f sedscript filename
sed的多行模式
xml或json配置文件为多行出现
多行模式处理命令 | 含义 |
---|---|
N | 将下一行加入到模式空间 |
D | 删除模式空间中的第一个字符到第一个换行符 |
P | 打印模式空间中的第一个字符到第一个换行符 |
两行合并为一行处理
sed "N;s/a/b/g" # 两行合并成一行读取处理
示例文件
hel
lo
sed 'N;s/hel\nlo/!!!/' filename # 双行读取匹配,注意换行符"\n"
sed 'N;s/hel.lo/!!!/' filename # 也可使用正则"."
示例文件
hell
o bash hel
lo bash
sed 'N;s/\n//;s/hello bash/hello sed\n/;P;D' filename
# 读取下一行(2行一处理),先将\n替换为空,hello bash替换为hello
# sed\n,循环处理
sed 'N;N;s/\n//;s/hello bash/hello sed\n/;P;D' filename
# 3行一处理
保持空间
保持空间也是多行的一种操作方式
将内容暂存在保持空间,便于做多行处理
保持空间命令 | 含义 |
---|---|
h | 将模式空间内容覆盖到保持空间(默认保存空间内有换行符,首次使用h将换行符覆盖) |
H | 将模式空间内容追加到保持空间 |
g | 将保持空间内容覆盖到模式空间 |
倒序输出
sed -n '1h;1!G;$!x;$p' # 1!G不对第一行处理
sed -n '1!G;h;$p'
sed -n '1!G;h;$!d'
awk
awk脚本的流程控制
输入数据前历程 BEGIN{}
主输入循环 {}
所有文件读取完成例程 END{}
记录和字段
- 每行称作awk的记录
- 使用空格、制表符分隔开的单次称作字段
- 也可以自己指定分割的字段
字段的引用
awk中使用$1 $2 … $n 表示每一个字段,$0为整行
awk '{ print $1,$2,$3}' filename
awk 可以使用 -F 选项改变字段分隔符
awk -F ',' '{ print $1,$2,$3}' filename
分隔符可以使用正则表达式
例:
awk -F "'" '/^menu/{ print x++,$2 }' /boot/grub2/grub.cfg
# 打印以 menu 开头的第二列
结果:
0 CentOS Linux (5.1.11) 7 (Core)
1 CentOS Linux (3.10.0-1160.el7.x86_64) 7 (Core)
2 CentOS Linux (0-rescue-2362688d55a948b0a2829c283eab17e9) 7 (Core)
awk的表达式
赋值操作符
= 是最常用的赋值操作符
var1 = "name"
var2 = "hello" "world"
var3 = $1
其他赋值操作符
操作符 | 含义 |
---|---|
++ | 变量自加1 |
– | 变量自减1 |
+= | 将加的结果赋给变量 |
-= | 将减的结果赋给变量 |
*= | 将乘的结果赋给变量 |
/= | 将除的结果赋给变量 |
%= | 将取余的结果赋给变量 |
^= | 将取幂的结果赋给变量 |
**= | 将取幂的结果赋给变量 |
算数操作符
操作符 | 含义 |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
% | 取余 |
^ | 幂 |
系统变量
- FS 和 OFS 字段分隔符,FS表示输入文件以什么分隔符判断,OFS 表示输出的字段分隔符
head -5 /etc/passwd | awk 'BEGIN{FS=":";OFS=","}{print $1,$2}'
# 读入分隔符使用":",输出分隔符使用","
- RS 记录分隔符,默认为换行符
head -5 /etc/passwd | awk 'BEGIN{RS=":"}{print $0}'
# 以“:”作为一条记录的分隔符
NR 和 FNR 行数;处理多文件时,FNR跟随文件,NR则为总行数;
NF 字段数量,最后一个字段内容可以用 $NF 取出
关系操作符
操作符 | 含义 |
---|---|
< | 小于 |
> | 大于 |
<= | 小于等于 |
>= | 大于等于 |
== | 等于 |
!= | 不等于 |
~ | 匹配正则表达式 |
!~ | 不匹配正则表达式 |
布尔操作符
操作符 | 含义 |
---|---|
&& | 逻辑与 |
|| | 逻辑或 |
! | 逻辑非 |
awk条件判断语句
条件语句使用if开头,根据表达式的结果来判断执行哪条语句
if (表达式)
awk语句1
[else
awk语句2
]
如果有多个语句需要执行可以使用{}将多个语句扩起来
awk '{if($2>=80) {print $1; print $2} }' filename
awk循坏语句
while 循坏
while(表达式)
awk 语句1
do 循环
do{
awk 语句1
}while(表达式)
for 循环
for(初始值; 循环判断条件; 累加)
awk 语句1
例:
awk '{sum=0; for(c=2;c<=NF;c++) sum+=$c; print sum/(NF-1)}' filename
# 计算第2列到最后一列的平均数
影响控制的其他语句
- break
- continue
awk 数组
数组的定义
数组:一组有某种关联的数据(变量),通过下标依次访问
数组名[下标]=值
下标可以使用数字也可以使用字符串
数组的遍历
for(变量 in 数组名)
使用 数组名[变量] 的方式依次对每个数组的元素进行操作
删除数组
delete 数组[下标]
awk '{ sum=0; for(c=2;c<=NF;c++) sum+=$c; avg[$1]=sum/(NF-1)}END{ for(user in avg) sum2+=avg[user] ;print sum2/NR}' filename
awk -f script.awk filename # awk使用脚本文件处理filename
命令行参数数组
- ARGC awk 参数数量
- ARGV awk 参数数组
数组综合应用处理脚本
处理数据文件
user1 70 72 74 76 74 72
user2 80 82 84 82 80 78
user3 60 61 62 63 64 65
user4 90 89 88 87 86 85
user5 45 60 63 62 61 50
awk脚本文件
{
sum = 0
for(c = 2; c <= NF; c++)
sum += $c
avg[$1] = sum / ( NF - 1 )
if( avg[$1] >= 80 )
letter = "S"
else if( avg[$1] >= 70 )
letter = "A"
else if( avg[$1] >= 60 )
letter = "B"
else
letter = "C"
letter_all[letter]++
print $1,avg[$1],letter
}
END{
for( user in avg )
sum_all += avg[user]
avg_all = sum_all / NR
print "average all:" avg_all
for( user in avg )
if( avg[user] > avg_all )
above++
else
below++
print "above",above
print "below",below
print "S:",letter_all["S"]
print "A:",letter_all["A"]
print "B:",letter_all["B"]
print "C:",letter_all["C"]
}
执行:
awk -f result.awk kpi.txt
结果:
user1 73 A
user2 81 S
user3 62.5 B
user4 87.5 S
user5 56.8333 C
average all:72.1667
above 3
below 2
S: 2
A: 1
B: 1
C: 1
awk 函数
算数函数
函数 | 含义 |
---|---|
sin() | 正弦函数 |
cos() | 余弦函数 |
int() | 取整 |
rand() | 基于种子的伪随机数 ,范围0~1 |
srand() | 重新获取种子,两者配合使用 |
awk 'BEGIN{pi=3.14; print int(pi) }' # 取整,结果:3
awk 'BEGIN{srand();print rand()}' # 生成随机数
字符函数
函数 | 含义 |
---|---|
gsub( r,s ) | 在整个 $0 中用 s 替代 r |
gsub( r,s,t ) | 在整个 t 中用 s 替代 r |
index( s,t ) | 返回 s 中 字符串t 的第一位置 |
length( s ) | 返回 s 长度 |
match( s,r ) | 测试 s 是否包含匹配r的字符串 |
split( s,a,sep ) | 在 sep 上将 s 分成序列 a |
sub( r,s,t ) | 用 t 中最左边最长的子串代替 s |
substr( s,p,n ) | 返回 字符串s 中从 p 开始长度为 n 的后缀部分 |
自定义函数
function 函数名(参数){
awk语句
return awk变量
}
例:
awk 'function a(str){ return str str} BEGIN{ print a("b")}'
wc
统计
wc filename # 统计 filename 文件的行数、单词数、字节数
wc -l filename # 统计 filename 文件的行数
uniq
去除重复行
uniq filename # 去除 filename 文件中重复的行
diff
比较两个文件的差异
diff -u 源文件名 修改后文件名 # 比较两个文件的不同,u选项(Unified),显示行号
diff -u 源文件名 修改后文件名 > filediff.patch # 将不同存成patch补丁文件
patch
打补丁
patch 源文件名 filediff.patch # 应用补丁文件,将 源文件 变更为 修改后的文件
split
拆分文件
split <参数> <要分割的文件> [输出文件名前缀]要分割的文件>参数>
参数 | 含义 |
---|---|
-b | 指定每个分割文件的大小,单位有K、M、G、P等 |
-d | 指定分割文件的后缀为数字 |
-a | 指定分割文件数字后缀的长度,如果是1,后缀为0,1,2…;如果是2,则为00,01,02…;默认是2 |
-C | 指定每行最大的字节数 |
-l | 指定每个文件最大的行数 |
split -b 100M -d -a 1 test.tar.gz test.tar.gz. # 将 test.tar.gz 压缩包拆分成100MB大小的小包,输出命名为 test.tar.gz.1、test.tar.gz.2、test.tar.gz.3 ...
cat test.tar.gz.* | tar -zxv # 将分卷压缩包解压
paste
合并文件
paste file1 file2 file3 # 将file1、file2、file3 按列合并
paste -s file1 file2 file3 # 将file1、file2、file3 按行合并
sort
排序
sort filename # 将 filename 的内容正向排序
sort -r filename # 将 filename 的内容反向排序
join
文本按相同列名合并
测试文本:
file1:
aaa 123
bbb 456
file2:
aaa 88
bbb 99
join file1 file2 # 将file1 和 file2 按相同列名合并
结果:
aaa 123 88
bbb 456 99
tr
转换或删除文件中的字符
cat file | tr a-z A-Z # 将file中的字母全部转换成大写
磁盘和文件系统
磁盘
df
文件系统查看命令
选项 | 含义 |
---|---|
-a | 显示所有的文件系统信息,包括特殊文件系统,如/proc. /sysfs |
-h | 使用习惯单位显示容量,如KB, MB或GB等 |
-T | 显示文件系统类型 |
-m | 以MB为单位显示容量 |
-k | 以KB为单位显示容量,默认就是以KB为单位 |
df -hT # 显示当前系统分区使用情况及分区格式
du
统计目录或文件大小
选项 | 含义 |
---|---|
-a | 显示每个子文件的磁盘占用量。默认只统计子目录的磁盘占用量 |
-h | 使用习惯单位显示磁盘占用量,如KB, MB或GB等 |
-s | 统计总占用量,而不列出子目录和子文件的占用量 |
du -sh /root # 统计/root目录文件占用空间
sync
清空缓存,将数据同步写入磁盘;一般卸载分区前使用。
fdisk
分区(分区格式为MBR,2.1TB 以下的硬盘)
fdisk /dev/sdb # 将/dev/sdb磁盘进行分区
命令 | 说明 |
---|---|
a | 设置可引导标记 |
b | 编辑bsd磁盘标签 |
c | 设置DOS操作系统兼容标记 |
d | 删除一个分区 |
l | 显示已知的文件系统类型。82为Linux sw叩分区,83为Linux分区 |
m | 显示帮助菜单 |
n | 新建分区 |
o | 建立空白DOS分区表 |
p | 显示分区列表 |
q | 不保存退出 |
s | 新建空白SUN磁盘标签 |
t | 改变一个分区的系统ID |
u | 改变显示记录单位 |
v | 验证分区表 |
w | 保存退出 |
x | 附加功能(仅专家) |
重新读取分区表信息
partprobe
fdisk -l # 显示所有磁盘设备及分区
parted
分区(分区格式为GPT)
parted -l 显示分区
parted /dev/sdb 把sdb进行分区
mdadm
软RAID组建
选项 | 含义 |
---|---|
-n | 设备数量 |
-l | raid级别 |
-C | 创建raid设备 |
-S 或 –stop | 停止raid设备 |
-D | 显示raid设备详细信息 |
–remove | 删除RAID设备 |
mdadm -C /dev/md0 -a yes -l 1 -n 2 /dev/adb1 /dev/sdc1
# 将/dev/adb1 和 /dev/sdc1 创建为/dev/md0,级别为raid1
mdadm -D /dev/md0 # 查看/dev/md0 RAID设备详细信息
lsblk
lsblk -f # 显示UUID及分区结构
文件系统
mount
挂载
选项 | 含义 |
---|---|
-l | 查询系统中已挂载的设备并显示卷标名称 |
-a | 依据配置文件 /etc/fstab 的内容,自动挂载 |
-t | 文件系统类型,ext3、ext4、iso9660、vfat(FAT32)、fat(FAT16) |
-L | 卷标名 |
-o | 特殊选项,见下表 |
-o特殊选项 | 说明 |
---|---|
atime/noatime | 更新访问时间/不更新访问时间。访问分区文件时,是否更新文件的访问时间,默认为更新 |
async/sync | 异步/同步,默认为异步 |
auto/noauto | 自动/手动,mount -a命令执行时,是否会自动安装/etc/fstab文件内容挂载,默认为自动 |
defaults | 定义默认值,相当于rw,suid,dev,exec,auto,nouser,async这七个选项 ,可移动硬盘不推荐defaults,推荐使用”nodev,nofail” |
exec/noexec | 执行/不执行,设定是否允许在文件系统中执行可执行文件,默认是exec允许 |
remount | 重新挂载已经挂载的文件系统,一般用于指定修改特殊权限 |
rw/ro | 读写/只读,文件系统挂载时,是否具有读写权限,默认是rw |
suid/nosuid | 具有/不具有SUID权限,设定文件系统是否具有SUID和SGID的权限,默认是具有 |
user/nouser | 允许/不允许普通用户挂载,设定文件系统是否允许普通用户挂载,默认是不允许,只有roof可以挂载分区 |
usrquota | 写入代表文件系统支持用户磁盘配额,默认不支持 |
grpquota | 写入代表文件系统支持组磁盘配额,默认不支持 |
dev/nodev | 默认dev |
nofail | 如果设备故障也不影响引导启动,自动挂载推荐加上,若无此设备,系统启动不会卡住,推荐”defaults,nofail” |
mount # 查询系统中已挂载的设备
mount -l # 查询系统中已挂载的设备并显示卷标名称
mount [-t 文件系统] [-L 卷标名] [-o 特殊选项] 设备文件名 挂载点
mount -o remount,noexec /home # /home必须是单独的分区,重新挂载/home分区,并使用noexec权限
mount -t iso9660 /dev/cdrom /mnt/cdrom # 挂载光盘
mount /dev/sr0 /mnt/cdrom #挂载光盘
mount -o loop /root/rhel7.iso /media # 挂载iso光盘文件
umount
卸载
umount 设备文件名或挂载点
umount /mnt/cdrom # 卸载,挂载点
umount /dev/sde1 # 卸载,设备名
eject
弹出光驱
dd
选项 | 含义 |
---|---|
if | 输入 |
of | 输出 |
ibs | 一次读入字节数 |
obs | 一次输出字节数 |
bs | 同时设置读入/输出的块大小 |
cbs | 一次转换字节数 |
skip | 从输入文件开头跳过块数 |
seek | 从输出文件开头跳过块数后再复制 |
count | 仅复制块数 |
dd if=/dev/zero bs=4M count=10 of=/afile
# 生成全0文件/afile,大小为40MB
dd if=/dev/zero bs=4M count=10 seek=20 of=/bfile
# 生成全0文件/bfile,ls显示120MB,du显示40MB,“seek=20”代表跳过 4MBx20
dd if=/dev/sda of=mbr.bin bs=512 count=1 # 备份sda的mbr
dd if=/dev/sda of=/dev/sdb # 将/dev/sda整盘备份到/dev/sdb
dd if=/dev/sda of=/root/image # 将/dev/sda整盘备份到/root/image文件中
dd if=/root/image of=/dev/sda # 将备份的/root/image文件恢复到/dev/sda中
dd if=/dev/sdb | gzip > /root/image.gz # 将/dev/sdb的数据压缩并备份到/root/image.gz中
gzip -dc /root/image.gz | dd of=/dev/sdb # 将/root/image.gz解压并还原到/dev/sdb中
dd if=/dev/urandom of=/dev/sda1 # 利用随机数填充/dev/sda1
dd if=/dev/mem of=/root/mem.bin bs=1024 # 复制内存中的数据到/root/mem.bin,大小为1kB
dd if=/dev/cdrom of=/root/cd.iso # 备份光盘内容到/root/cd.iso
mkfs
格式化分区
mkfs -t ext4 /dev/sdb1 # 格式化/dev/sdb1分区为ext4
mkfs.ext4 /dev/sdb1 # 格式化/dev/sdb1分区为ext4
mkfs.ntfs /dev/sdb1 # 格式化/dev/sdb1分区为ntfs
fsck
文件系统修复
选项 | 含义 |
---|---|
-a | 不用显示用户提示,自动修复文件系统 |
-y | 自动修复。和-a作用一致,不过有些文件系统只支持-y |
fsck -y /dev/sda1 # 自动修复/dev/sda1分区,需要先卸载分区
swap交换分区
mkswap
格式化swap文件
mkswap /swapfile # swap文件
mkswap /dev/sdb6 # swap分区
swapon
加入swap
swapon /swapfile # swap文件
swapon /dev/sdb6 # swap分区
swapoff
取消swap分区
swapoff /dev/sdb6 # swap文件
swapoff /dev/sdb6 # swap分区
LVM管理
pvcreate
创建物理卷
pvcreate /dev/sd[b,c,d]1
pvs
查看物理卷
vgcreate
创建卷组
vgcreate vg1 /dev/sdb1 /dev/sdc1
lvcreate
创建逻辑卷
lvcreate -L 100M -n lv1 vg1
lvs
查看逻辑卷
vgextend
扩充卷组
vgextend centos /dev/sdd1
lvextend
扩充逻辑卷
lvextend -L +100G /dev/centos/root
xfs_growfs
扩充文件系统
xfs_growfs /dev/centos/root
系统管理和资源监控
系统管理
资源监控
进程管理
进程查看
进程管理
用户和用户组管理
用户
用户组
用户信息
网络工具
网络路由
数据传输
网络诊断
软件包管理
其他命令
hexdump
文档信息
- 本文作者:Su Daozhen
- 本文链接:https://sudaozhen.github.io/wiki/linux-cmd/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)