cat /etc/shells
可获取系统当前安装的 shellecho $SHELL
或 echo $0
可获知当前用户的默认 shell (即 cat /etc/passwd
对应用户的最后一列),一般是 bash
/etc/passwd
文件最后一列,sudo usermod --shell shell命令路径 用户名
或 sudo chsh --shell shell命令路径 用户名
/bin/sh
指向的 shell (即 readlink /bin/sh
),Ubuntu 一般是 dash
cd /bin && sudo ln -sf shell名称 sh
,例如 cd /bin && sudo ls -sf bash sh
#
,UID(用户ID)是0,可以执行所有命令
sudo -i
: Ubuntu 切换到 root 用户且切换到它的家目录,不需要先启用和添加 root 用户密码sudo su
: Ubuntu 切换到 root 用户且停留在当前目录,不需要先启用和添加 root 用户密码su
: 切换到 root 用户且停留在当前目录,Ubuntu 需要 sudo passwd root
先添加 root 用户密码才能使用 susu <user>
: 切换到 user 用户,例如: su lengjing
exit
: 返回切换前的用户,如果是最后一个用户会关闭终端(也可以 CTRL + d
)$
,不可以执行特权命令,需要在命令前面加 sudo
才可以执行特权命令
sudo <command>
: 加上 sudo 运行特权命令e键
就能够进入 grub 编辑模式e键
进入行编辑,行的最后输入 single
回车键
确定之后,按下 b键
就会启动进入单人维护模式passwd <username>
修改密码passwd <username>
: 修改密码 /etc/passwd
sudo passwd root
: 添加或修改 root 用户密码sudo passwd -l root
: 使 root 用户密码过期(禁用 root 用户)sudo passwd -u root
: 使 root 用户密码有效(启用 root 用户)useradd / usermod / userdel
: 增加/删除/修改用户
useradd -m <username>
: 为用户创建相应的帐号和用户家目录 /home/username
userdel -r <username>
: 删除用户账号和用户家目录usermod -a -G <groupname> <username>
: 将用户追加到用户组(例如串口组 dialout)groupadd / groupmod / groupdel
: 增加/删除/修改组 /etc/group
/etc/profile
~/.bash_profile
~/.bash_login
~/.profile
: 登录时自动 source 此类脚本
/etc/profile
和用户登录配置(三选一,前面优先) ~/.bash_profile
~/.bash_login
~/.profile
/etc/profile
时会 source 其它脚本 /etc/bash.bashrc
/etc/profile.d/*.sh
等/etc/bash.bashrc
~/.bashrc
: 打开新终端时自动 source 此类脚本
~/.bashrc
改变环境变量 PATH
和 定义别名 alias
等~/.bash_logout
: 登出时自动 source 此脚本~/.bash_history
: 记录之前输入的命令,也可以 history
命令列出command [-options] parameter1 parameter2 ...
./
-
,长选项前通常会带 --
,有的选项前可能什么都不带alias new_command='command sequence'
alias
表示列出所有已定义的别名command sequence
中可以使用 $@
表示命令参数unalias new_command
~/.bashrc
配置文件\command
alias ll='ls -al'
和取消别名 unalias ll
man <num> command
num
: 查看对应类型的手册(不加 num 时表示找到第1个有效的章节)
1
: 可执行程序或 shell 命令,例如: man stat
or man 1 stat
2
: 系统调用(内核提供的函数),例如: man 2 stat
3
: 库调用(程序库中的函数),例如: man fopen
or man 3 fopen
-f
: 等同于 whatis
,显示来自手册页的简短说明(若有),command 必须精确匹配命令
whatis -w
: 支持通配符,例如: whatis -w loc*
-k
: 等同于 apropos
,搜索关键词对应的手册概述并显示所有匹配结果,command 可以是命令的一部分/string
向下搜 ; ?string
向上搜 ; n
继续 ; N
反向继续[空格键]
向下翻页 ; [PgUp]
[PgDn]
[Home]
[End]
翻上/下/首/尾页--help
或 -h
选项可显示命令帮助中文版 man
wget https://src.fedoraproject.org/repo/pkgs/man-pages-zh-CN/v1.6.3.6.tar.gz/sha512/dc9ecd461eba41fc30658e028f853e3664fc6ce27c5b48c3159c5c8a452ad6d71730e0e5f551efa7b4c358baf010ba27a855457ae69b21e9637af326044dcca8/v1.6.3.6.tar.gz
tar -xvf v1.6.3.6.tar.gz
cd manpages-zh-1.6.3.6/
sudo apt install autotools-dev opencc
autoreconf --install --force
./configure --disable-zhtw --prefix=/usr/local/zhman
make && sudo make install
~/.bashrc
中加入下面的内容
cman() {
man -M /usr/local/zhman/share/man/zh_CN $@ || man $@
}
export -f cman
cman <cmd>
: cmd 有中文说明时查看中文手册,没有中文时查看 man 原始的英文手册命令位置
which
: 查找命令
-a
: 将所有由 PATH
定义的目录中找到的命令均分行列出,而不是第1个被找到的命令whereis
: 查找特定文件(二进制文件、源码文件、说明文件等),同一行列出locate
: 依据 /var/lib/mlocate
内的数据库记载,找出使用者输入的关键字档名(需要安装 mlocate
)
-i
: 忽略大小写的差异-r
: 使用正则表达式查找updatedb
根据 /etc/updatedb.conf
的配置去更新 /var/lib/mlocate
数据库cmd1 ; cmd2
: 同一行的多个命令可以用分号分隔cmd1 | cmd2
: 管道命令,上一个命令的输出 stdout 作为下一个命令的输入 stdin,常与 xargs
连用cmd1 || cmd2
: 命令序列短路或执行: 若 cmd1 正确执行完毕,则不再执行 cmd2 ; 否则继续运行 cmd2cmd1 && cmd2
: 命令序列短路与执行: 若 cmd1 正确执行完毕,则继续运行 cmd2 ; 否则不再执行 cmd2cmd &
: 后台运行命令$(cmd)
: 获取命令的输出值,也可以使用 `cmd`
(cmd)
: 子 shell 命令组,当命令在子 shell 中执行时,不会对当前 shell 有任何影响,所有的改变仅限于子 shell 内
pwd; cd ..;pwd
当前目录改变了,加小括号后 pwd;(cd ..);pwd
当前目录没改变{cmd}
: 命令区块$?
: 最后运行的命令的结束代码(返回值),成功值为0var=value
_
,且头字符不能是数字PWD
当前目录、USER
当前用户名、HOME
当前用户家目录、SHELL
当前 shell、PATH
命令搜索路径cat /proc/$PID/environ | tr '\0' '\n'
可查看进程相关的环境变量;
等特殊符号,那么它就不需要使用引号进行引用,否则必须使用单引号或双引号var = value
不是赋值而是比较的意思local
$var
or ${var}
${#var}
array=(test0 test1)
: 定义一个普通数组
array[0]=test0; array[1]=test1
array[n]
: 取数组的第n个元素的值,n从0开始declare -A array
: 声明一个关联数组array=([ia]=test0 [ib]=test1)
: 将元素添加到关联数组中
array[ia]=test0; array[ib]=test1
array[index]
: 取关联数组的索引文本为 index
的元素的值${array[*]}
or ${array[@]}
: 数组所有元素值组成的列表${!array[*]}
or ${!array[@]}
: 数组所有元素索引组成的列表${#array[*]}
or ${#array[@]}
: 数组元素个数eval
: 变量引用前加 eval
会把变量字符串当作命令执行env
: 查看所有的环境变量set
: 查看所有的环境变量和自定义变量unset var
: 删除变量定义export var
: 导出变量,可同时导出多个变量(空格分隔),则从当前 shell 执行的任何程序都会继承这个变量
export var=value
: 定义并导出变量export PATH=$PATH:/home/user/bin
会将 /home/user/bin
添加到了环境变量 PATH
中${var:start:length}
var
是变量名,start
是开始位置,length
是切片的长度start
序号从 0
开始,也可以使用负数,-1
是最后一个字符start
是负数时必须在 var
的冒号后加空格或用小括号把数值括起来:length
,此时表示切片到字符串结尾length
可以使用负数,此时不再表示长度的意思,而是切片到索引(不含)的意思var=www.google.com
)
${var: -3}
: 提取最后3个字符,也可以写成 ${var:(-3)}
,不可以写成 ${var:-3}
,例子值为 "com"${var:4}
: 提取第4个(不含)字符之后的所有字符,也可以写成 ${var: 4}
,例子值为 "google.com"${var:4:6}
: 提取第4个(不含)字符之后的6个字符,也可以写成 ${var:4:-4}
,例子值为 "google".
表示定界作用,可换成其它的定界符,也可以使用多个字符*
星号表示匹配任意数量(含0个)的任意字符,?
问号表示匹配单个任意字符var=www.google.com
)
${var#*.}
: 从左边开始,去掉第一个符号'.'左边的所有字符,例子值为 "google.com"${var##*.}
: 从右边开始,去掉第一个符号'.'左边的所有字符,例子值为 "com"${var%.*}
: 从右边开始,去掉第一个符号'.'右边的所有字符,例子值为 "www.google"${var%%.*}
: 从左边开始,去掉第一个符号'.'右边的所有字符,例子值为 "www"${var#????}
: 表示删除前面4个字符,例子值为 "google.com"${var%????}
: 表示删除后面4个字符,例子值为 "www.google"expression
的运算符和表达式符合C语言运算规则即可
${var:+expression}
: 如果 var 有值且不为空,则使用 expression
的值$[ expression ]
: 取运算 expression
的值(注意 expression
前后有空格),出现在 [ ]
中的变量名之前可加可不加 $
$(( expression ))
: 取运算 expression
的值(注意 expression
前后有空格),出现在 (( ))
中的变量名之前可加可不加 $
$(expr expression)
: 取运算 expression
的值,出现在 ( )
中的变量名之前要加 $
let expression
: 进行 expression
运算更新值,例如: let num++ ; let num-- ; let num+=1 ; let num-=1 ; let num=1+1
echo "expression" | bc
echo "scale=2;22/7" | bc
将输出 3.14echo "obase=2;10" | bc
将输出 1010 ; echo "obase=10;ibase=2;1010" | bc
将输出 10echo "10^2" | bc
将输出 100 ; echo "sqrt(100)" | bc
将输出 10echo [options] expression
: 通用打印
;
,即使加 -e
也无法打印转义,例如: echo -e \t
会打印\t
echo '$SHELL'
打印 $SHELL
echo "$SHELL"
或 echo $SHELL
打印 /bin/bash
echo $(ls -l)
输出没有换行,echo "$(ls -l)"
输出有换行-n
: 不换行,后面输出紧接着这行(echo 默认会将一个换行符追加到输出文本的尾部)-e
: 启用 ASCII-C 转义字符
的解释,例如: echo -e "\t"
或 echo -e '\t'
会打印 tab,不加 -e 直接打印\t
echo -e "\033[背景色;前景色m字符串\033[0m"
,例如: echo -e "\033[41;37m红底白字\033[0m"
\033[0m
: 关闭所有属性(注: \033
可以写成 \e
)\033[4x;3xm
: 同时设置背景色和前景色(x是数字代表: 0
黑 1
红 2
绿 3
黄 4
蓝 5
紫 6
天蓝 7
白)\033[4xm
: 只设置背景色\033[3xm
: 只设置前景色-e
echo { .. }
: 生成值序列,例如: echo {a..z}
echo {0..100}
printf FORMAT [ARGUMENT]
: 格式化打印
printf "%3.2f %s\n" 3.1415926 $PATH
read [options] var1 var2 ...
: 读取来自键盘输入的变量
-p tip_str
: 提示-t sec
: 最多等待 sec 秒-n num
: 最多读取的 num 个字符-d separator
: 特定定界符 separator 作为输入行的结束,默认结束符是换行符,变量的输入分隔符是空格-s
: 无回显读取,用于读取密码$ read -p "Please keyin your name and age: " your_name your_age
Please keyin your name and age: lengjing 30
$ echo "The age of $your_name is $your_age."
The age of lengjing is 30.
> >> <
: 重定向文件
>
清空文件再输入(>
等同于1>
); >>
追加到文件; <
从文件中读取
0
stdin(标准输入) 1
stdout(标准输出) 2
stderr(标准错误):> file
: 清空文件,例如: :> a.txt
cmd 2> stderr.txt 1> stdout.txt
cmd 2>&1 output.txt
or cmd &> output.txt
cmd > output.txt 2>&1
cmd 2> /dev/null
cmd | tee output.txt
: tee只能从stdin中读取,终端中打印,并复制一份输出将它重定向到一个文件中
-a
选项追加内容./script_name.sh
or bash script_name.sh
: 启用新的 sub-shell (新的子进程) 执行命令脚本. script_name.sh
or source script_name.sh
: 在当前 shell 下执行脚本,此时执行新的程序还可以访问脚本导出的变量等chmod +x script_name.sh
才可以执行#!/bin/bash
在宣告这个 script 使用的 shell 类型\
来延伸至下一行sleep 整数或浮点数
在脚本中延时一段时间(秒)-n
标志运行脚本只是读一遍脚本中的命令但不执行,用于检查脚本中的语法错误,例如: bash -n ./configure
-x
标志运行脚本可以打印出所执行的每一行命令以及当前状态,例如: bash -x ./configure
set -x
(在执行时显示参数和命令) 和 set +x
(禁止调试) ,对包起来的命令进行调试set –v
(当命令进行读取时显示输入) 和 set +v
(禁止打印输入),对包起来的命令进行调试#!/bin/bash -xv
,启用全程调试功能exit
return
source script_name.sh
时 exit
会退出当前终端,而 return
不会$$
: shell 本身的 PID (ProcessID)$!
: shell 最后运行的后台进程的 PID$?
: 最后运行的命令的结束代码(返回值),成功值为0$*
: 所有参数列表,以 "$1 $2 … $n"
的形式输出所有参数,$*
不被双引号包围时,效果同 $@
; 被双引号包围时,将所有的参数看做一份数据$@
: 所有参数列表,以 "$1" "$2" … "$n"
的形式输出所有参数,将每个参数都看做一份数据$#
: shell 的参数个数${BASH_SOURCE[0]}
: source 脚本时脚本的路径名$0
: 普通执行脚本时脚本的路径名$1~$n
: shell 脚本的各参数值,$1
是第1参数、$2
是第2参数 ... ,当n>=10时,需要使用 ${n}
来获取参数a:
; 使用时参数和值之间可选是否带空格,类似 -a valuea
or -avaluea
b::
; 使用时参数和值之间不能带空格,类似 -bvalueb
c
; 使用时没有参数,类似 -c
long-a:
; 使用时参数和值之间可选是等号还是空格,类似 --long-a=valuea
or --long-a valuea
long-b::
; 使用时参数和值之间只能是等号,类似 --long-b=valueb
long-c
; 使用时没有参数,类似 --long-c
getopts
: bash 的内部命令
"a:c"
: 声明命令选项,getopts
只支持短命令选项且不支持可选带参数的选项OPTARG
: 特殊变量,自动设置此变量的值为当前命令选项的值(确切的说是下一个参数)OPTIND
: 特殊变量,自动设置此变量的值为下一个参数的序号#!/bin/bash
while getopts "a:c" opt; do
case $opt in
a) printf "%-40s%s\n" "option: -$opt" "parameter: $OPTARG";;
c) printf "%-40s%s\n" "option: -$opt" "parameter: None";;
*) echo "Error option: -$opt"; exit 1;;
esac
done
getopt
: 规范化命令参数
-o shortopts
: 声明短命令选项,只有长命令选项时此选项的值必须置空 -o ''
,不能省略-l longopts
: 声明长命令选项,多个长命令选项使用逗号 ,
分隔--
: 固定写法,它的后面是原始的命令参数,getopt 生成的新的命令参数的最后一项是 --
eval set -- "str"
: 将 str 替换为当前脚本的参数集shift num
: 丢弃前面 num 个参数,不加 num 时丢弃一个,例如: 运行 shift
,$1
被丢弃,$2
变成了 $1
#!/bin/bash
eval set -- "$(getopt -o a:b::c -l long-a:,long-b::,long-c -- $@)"
while :; do
case $1 in
-a|--long-a)
printf "%-40s%s\n" "option: $1" "parameter: $2"
shift 2
;;
-b|--long-b)
if [[ -z $2 ]]; then
printf "%-40s%s\n" "option: $1" "parameter: None"
else
printf "%-40s%s\n" "option: $1" "parameter: $2"
fi
shift 2
;;
-c|--long-c)
printf "%-40s%s\n" "option: $1" "parameter: None"
shift
;;
--)
shift
break
;;
*)
echo "Error option: $1"
exit 1
;;
esac
done
function
可以省略
function
这个关键字$1 $2 ...
表示,注意函数里面的这些值不再是脚本的参数($0
还是脚本名)function fname() {
expression
}
or
fname() {
expression
}
fname
或 fname arg1 arg2 ...
,不需要括号export -f fname
用来导出函数注意条件测试语句的条件和中括号之间是有空格的,不能省略空格
数值比较
[ $var -eq value ]
-eq
相等; -ne
不等; -gt
大于; -ge
大于等于; -lt
小于; -le
小于等于文件系统测试
[ -f $var ]
:
-f
是文件; -d
是目录; -e
文件存在; -s
非空文件-r
文件可读; -w
文件可写; -x
文件可执行-u SUID
; -g SGID
; -k SBIT
-c
是字符设备; -b
是块设备; -L
是符号链接; -S
是socket; -p
是FIFO/pipe[ file1 -nt file2 ]
-nt
新; -ot
旧; -ef
指向同一inode字符串比较
[[ $str1 = $str2 ]]
=
相等; ==
相等; !=
不等; <
小于; >
大于=
表示相等[[ -z $var ]]
-z
空字符串; -n
非空字符串[ -n $var ]
表示是否定义,变量赋值为空也是定义了多条件组合
[[ -n $var ]] && [[ $str1 = $str2 ]]
&&
和 ||
能够很容易地将多个条件组合起来[[ -n $var -a $str1 = $str2 ]]
[ $var -lt minvalue -o $var -gt maxvalue ]
-a
逻辑与; -o
逻辑或[[ ! -z $var ]]
!
条件取反单/双中括号区别
*
进行扩展,而双括号 TEST 命令则会对 *
进行扩展<
和 小于号 >
加转义符 \
,直接而双括号 TEST 命令不需要test
指令相当于单中括号,即 test condition
相当于 [ condition ]
lengjing@lengjing:~$ var="a b"
lengjing@lengjing:~$ [ $var = "a b" ]; echo $?
bash: [: 参数太多
2
lengjing@lengjing:~$ [[ $var = "a b" ]]; echo $?
0
lengjing@lengjing:~$ [ "$var" = "a b" ]; echo $?
0
lengjing@lengjing:~$ [[ "$var" = "a b" ]]; echo $?
0
lengjing@lengjing:~$ var="a b"
lengjing@lengjing:~$ [ $var = a* ]; echo $?
bash: [: 参数太多
lengjing@lengjing:~$ [[ $var = a* ]]; echo $?
0
lengjing@lengjing:~$ [[ "$var" = a* ]]; echo $?
0
lengjing@lengjing:~$ [ "$var" = "a*" ]; echo $?
1
lengjing@lengjing:~$ [[ "$var" = "a*" ]]; echo $?
1
lengjing@lengjing:$ [ a < b ]; echo $?
bash: b: 没有那个文件或目录
lengjing@lengjing:$ [ a \< b ]; echo $?
0
lengjing@lengjing:$ [[ a < b ]]; echo $?
0
lengjing@lengjing:$ [ a > b ]; echo $?
0
lengjing@lengjing:$ [ a \> b ]; echo $?
1
lengjing@lengjing:$ [[ a > b ]]; echo $?
1
if command; then
expression
elif command; then
expression
else
expression
fi
if [ condition ]; then
expression
elif [ condition ]; then
expression
else
expression
fi
双引号
括起来,关键字则为 右圆括号
两个连续的分号
来处理*
来代表所有其他值,esac
关键字结尾|
表示两个值,例如: H264 | HEVC)
[a-z])
case $var in
pattern1)
expression
;;
pattern2 | pattern3)
expression
;;
[pattern4-patternn])
expression
;;
*)
expression
;;
esac
for i in $( seq 1 10 )
or for i in {1..10}
IFS
的默认值为空白字符(空格符 换行符 制表符),可修改此变量从而使序列发生变化bIFS=$IFS; IFS=':'; for i in $(cat /etc/passwd); do echo $i;done
for var in list; do
expression
done
for (( i=0; i<10; i++ ))
for (( original; limit; step )); do
expression
done
while true
或 while :
表示死循环,只是 while :
不会每次执行循环内的命令时生成子进程
true
是作为一个二进制文件实现的,:
是 shell 的内建命令,它的退出状态总是为0while [ condition ]; do
expression
done
until [ condition ]; do
expression
done
注: 循环也有 break
continue
关键字
*
: 匹配任意个(含0个)任意字符?
: 匹配1个任意字符[ - ]
: 匹配1个中括号内的字符,例如: [a-b] 匹配1个小写字母[^ ]
: 匹配1个非中括号内的字符,例如: [^0-9] 匹配1个除了数字外的字符{ , }
: 匹配1个大括号的字符或字符串,例如: {ab,ba}
匹配 ab 或 ba注: 通配符主要用于匹配完整文件名,正则表达式主要用于匹配文件中的行的部分文本
重复(标准正则表达式)
.
: 匹配任意1个字符(是且只是1个),一般不会匹配换行符*
: 匹配前1个字符任意次(包括0次),例如: co*l
表示匹配 cl、col、coool ...{n}
: 匹配前面字符出现n次{n,}
: 匹配前面字符至少出现n次{n,m}
: 匹配前面字符出现n到m次重复(扩展正则表达式)
+
: 匹配前1个字符至少1次,例如: co+l
表示匹配 col、coool ... (不包括 cl)?
: 匹配前1个字符0次或1次,例如: co?l
表示匹配 cl、col注: 重复匹配符默认是贪婪匹配(尽可能匹配多的字符),可以在匹配符后加问号 ?
表示非贪婪匹配(尽可能匹配少的字符)
\< \>
: 精确匹配,如: \<the\>
表示精确匹配the这个单词,而不匹配包含the字符的单词^
: 匹配字符串开头,一般工具都是读取每行作为字符串,即 ^
看做匹配行首$
: 匹配字符串结尾,即 $
看做匹配行尾,例如: ^$
表示匹配空行 (注意 win 下的换行字符是 ^M$
,即 \r\n
)集合(标准正则表达式)
[ ]
: 匹配字符集,[]
里面不管有几个字符,他都只代表1个字符,字符集里面的特殊字符加不加转义斜杠 \
都可以,例如: [ab]
表示匹配a或匹配b[ - ]
: 匹配字符集(连续编码使用减号连接),例如: 大写字母 [a-z]
,小写字母 [a-z]
,数字 [0-9]
[^ ]
: 字符集的反向选择,例如: 非数字和英文 [^a-zA-Z0-9]
集合(扩展正则表达式)
|
: 匹配用或的方式找出数个字符串, 例如: ma(tri)|(ilbo)x
表示匹配 matrix 或 mailbox(pattern)
: 匹配子串,例如: ma(tri)?x
表示匹配 max 或 matrix高级扩展(一般 Python 可用)
\num
: 子串回溯匹配,\0
一般表示正则表达式本身,\1
表示第1个子项,\2
表示第2个....,例如: ([0-9])\1([0-9])\2
表示匹配 mmnn
格式的数字(?:pattern)
: 匹配子串,但子串不能回溯匹配(?aiLmsux)
: 设置正则表达式标记,可同时设置多个,标记前面加减号 -
表示关闭标记
i
忽略大小写 : 进行忽略大小写匹配,例如: (?i)b(?-i)ook
表示匹配 Book 或 bookm
多行模式 : 设置以后,^
匹配字符串的开始,和每一行的开始(换行符后面紧跟的符号);$
匹配字符串尾,和每一行的结尾(换行符前面那个符号)s
点号匹配全部字符 : 让 .
特殊字符匹配任何字符,包括换行符; 如果没有这个标记,.
匹配除了换行符的其他任意字符x
冗长模式 : 注释(#
后面的到行尾)和空白符号会被忽略a
只匹配 ASCII 字符 : 让 \w
, \W
, \b
, \B
, \d
, \D
, \s
和 \S
只匹配 ASCII,而不是 Unicode,只对 Unicode 样式有效L
语言依赖 : 由当前语言区域决定 \w
, \W
, \b
, \B
和大小写敏感匹配,这个标记只能对 byte 样式有效u
Unicode 匹配(?#annotation)
: 注释;里面的内容会被忽略(?P<name>pattern)
: 匹配 pattern 并为这个模式定义一个名字 name(?P=name)
: 匹配前面 name 定义的 pattern,例如: (?P<quote>['"]).*?(?P=quote)
表示匹配单引号或者双引号括起来的字符串patterna(?=patternb)
: 前视,只在后面是 patternb 的情况下匹配 patternapatterna(?!patternb)
: 前视取反,只在后面不是 patternb 的情况下匹配 patterna(?<=patternb)patterna
: 后视,只在前面是 patternb 的情况下匹配 patterna,例如: (?<=a)[0-9](?=b)
表示匹配处于ab之间的一个数字(?<!patternb)patterna
: 后视取反,只在前面不是 patternb 的情况下匹配 patterna\.
\*
\+
\-
\?
\[
\]
\{
\}
\(
\)
\\
\|
\0
: 空字符,十进制为 0,十六进制为 0x00\a
: 响铃,十进制为 7,十六进制为 0x07\b
: 退格符,十进制为 8,十六进制为 0x08\t
: 水平制表符,十进制为 9,十六进制为 0x09\n
: 换行符,十进制为 10,十六进制为 0x0A\v
: 垂直制表符,十进制为 11,十六进制为 0x0B\f
: 换页符,十进制为 12,十六进制为 0x0C\r
: 回车符,十进制为 13,十六进制为 0x0D\"
: 双引号,十进制为 34,十六进制为 0x22\'
: 单引号,十进制为 39,十六进制为 0x27\?
: 问号,十进制为 63,十六进制为 0x3F\\
: 反斜杠,十进制为 92,十六进制为 0x5C\nnn
: 1~3位八进制数字表示的字符\xHH
: 1~2位十六进制数字表示的字符\uHHHH
: 1~4位十六进制数字表示的 Unicode (ISO/IEC 10646) 字符\UHHHHHHHH
: 1~8位十六进制数字表示的 Unicode (ISO/IEC 10646) 字符\d
: 匹配数字 [0-9]
\D
: 匹配非数字 [^0-9]
\w
: 匹配字母数字下划线 [a-zA-Z0-9_]
\W
: 匹配非字母数字下划线 [^a-zA-Z0-9_]
\s
: 匹配空白字符 [\r\n\f\t\v ]
\S
: 匹配非空白字符 [^\r\n\f\t\v ]
\b
: 匹配单词边界(单词边界为字母数字下划线之间)\B
: 匹配非单词边界(单词边界为字母数字下划线之间)\A
: 匹配字符串开始\Z
: 匹配字符串结尾[[:digit:]]
)
[:digit:]
: 表示数字 [0-9]
[:xdigit:]
: 表示十六进制数 [a-fA-F0-9]
[:lower:]
: 表示小写字母 [a-z]
[:upper:]
: 表示大写字符 [A-Z]
[:alpha:]
: 表示大小写字母 [a-zA-Z]
[:alnum:]
: 表示大小写字母和数字 [a-zA-Z0-9]
[:blank:]
: 表示空格或 Tab [\t ]
[:space:]
: 表示空白字符 [\r\n\f\t\v ]
[:cntrl:]
: 表示 ASCII 控制字符,ASCII 码 0-31 和 ASCII 码 127[:print:]
: 表示 ASCII 码 32-126[:graph:]
: 表示 ASCII 码 33-126,比 [:print:]
少了空格[:punct:]
: 表示 ASCII 码 32-47 和 58-64 和 91-96 和 123-126,[:print:]
除去 [:alnum:]
find [path] [options] [action]
!空格
否定某项参数,例如: find . ! -name "*.o"
-name filename
: 搜寻文件名称为 filename 的文件,可以使用通配符
-iname filename
: 搜寻文件名称为 filename 的文件,忽略大小写-regex pattern
: 正则搜寻文件名称匹配 pattern 的文件-iregex pattern
: 正则搜寻文件名称匹配 pattern 的文件,忽略大小写-type typename
: 搜寻文件的类型为 typename 的文件,
f
一般文件 d
目录 l
符号链接 c
字符设备 b
块设备文件 s
socket p
FIFO-size +value
: 搜寻比 value 还要大的文件
c
1 byte; w
2 bytes; b
512 bytes; k
1024 bytes; M
1024k bytes; G
1024M bytes-size -value
: 搜寻比 value 还要小的文件,例如: 查找比1MB小的文件 find -size -1M
-newer filename
: 列出比 filename 文件还要新的文件-mtime num
: 列出在 num 天之前的那一天内被更改过内容的文件
+
表示 num 天之前(不含)改动,num 前加减号 -
表示 num 天之内(含)改动,ctime 和 atime 同理-ctime num
: 列出在 num 天之前的这一天内被更改过属性的文件-atime num
: 列出在 num 天之前的这一天内被访问过的文件-user username
: 文件所属用户为 username 的文件-group groupname
: 文件所属组为 groupname 的文件-perm xyz
: 文件属性为 xyz 的文件-L
: 如果符号链接指向了目录,默认不会查找指向的目录,该选项改变此默认值-maxdepth num
: 搜索最大深度为 num , num=1 时只在当前目录搜索-mindepth num
: 搜索最小深度为 num-a
or -and
: 逻辑与(AND)操作,例如: find . \( -name '*e*' -and -name 's*' \)
-o
or -or
: 逻辑或(OR)操作,例如: find . \( -name '*.c' -o -name '*.h' \)
-path GLOB -prune
: 排除某些文件夹,例如: find -path 'linux-*' -prune -o -path '.git' -prune -o -iname "*.c" -print
整条语句理解为当 prune 执行为 true 时,那么就不再执行后面的选项-print
: 打印找到的文件的文件名,默认动作-delete
: 删除找到的文件-exec command
: 对找到的文件执行 command
{}
表示对于每一个相应的匹配文件的文件名,例如: find -name *.html -exec cp {} ../html \;
./find.sh [find_str]
or ./find.sh [options]
,可使用 ./find.sh -h
查看详细帮助信息ignore_path
used_path
对应他自己的工程#!/bin/bash
find_str=
find_path=
ignore_path="arch-v1 arch-v2 arch-v3 arch-v4 arch-v5 armv7-a-hf armv8-a dsp-v1 dsp-v2 dsp-v3 ai-v1 ai-v2 linux* out"
used_path="arch-v5 armv8-a dsp-v3 ai-v2"
usage() {
echo "========================================"
echo -e "\033[34mUsage: '$0 find_str' or '$0 [options]'\033[0m"
echo -e "\033[34moptions:\033[0m"
echo -e "\033[34m-s find_str\033[0m : Specify the find string."
echo -e "\033[34m-p find_path\033[0m : Specify the find path."
echo " The default value is current dir."
echo -e "\033[34m-i ignore_path\033[0m : Specify the ignore dir names to process."
echo " The default value is all the dir names related to version."
echo -e "\033[34m-u used_path\033[0m : Specify the dir names which will be removed from the ignored dir names."
echo " The default value is 'arch-v5 armv8-a dsp-v3 ai-v2'."
echo "========================================"
}
if [ $# -eq 0 ]; then
usage
exit 1
elif [ $# -eq 1 ] && [[ $1 != '-h' ]]; then
find_str=$1
else
while getopts "s:p:i:u:h" opt; do
case $opt in
s) find_str=$OPTARG;;
p) find_path=$OPTARG;;
i) ignore_path=$OPTARG;;
u) used_path=$OPTARG;;
h) usage; exit 0;;
*) echo "Error option: -$opt"; usage; exit 1;;
esac
done
fi
for i in ${used_path}; do
ignore_path=$(echo "${ignore_path}" | sed -e "s:^${i} ::" -e "s: ${i} : :" -e "s: ${i}$::")
done
start_time_sec=`date +%s`
cmd=$(echo find ${find_path} -path \'*/.git\' -prune \
$(echo "${ignore_path}" | sed "s:\([*a-zA-Z0-9_\-]\+\):-o -path '*/\1' -prune:g") \
-o -name \"${find_str}\" -print)
cd `pwd`
eval $cmd
end_time_sec=`date +%s`
echo -e "\033[34mCost $(( $end_time_sec - $start_time_sec )) seconds.\033[0m"
echo -e "\033[32m$cmd\033[0m"
./ctags.sh
or ./ctags.sh [options]
,可使用 ./ctags.sh -h
查看详细帮助信息ignore_path
used_path
对应他自己的工程#!/bin/bash
# ctags和omnicppcomplete配合自动补全 ctags --c++-kinds=+p --fields=+ialS --extra=+q
# --c++-kinds=+p : 为C++文件增加函数原型的标签
# --fields=+ialS : 在标签文件中加入继承信息(i)、类成员的访问控制信息(a)、 源文件语言包含信息(l)、以及函数的指纹(S)
# --extra=+q : 为标签增加类修饰符,如果没有此选项,将不能对类成员补全
ctags=ctags
more_options="--c++-kinds=+p --fields=+ialS --extra=+q"
find_path=
ignore_path="arch-v1 arch-v2 arch-v3 arch-v4 arch-v5 armv7-a-hf armv8-a dsp-v1 dsp-v2 dsp-v3 ai-v1 ai-v2 linux* out"
used_path="arch-v5 armv8-a dsp-v3 ai-v2"
find_suffix="c h cc cpp c++ hh hpp hxx"
usage() {
echo "========================================"
echo -e "\033[34mUsage: '$0' or '$0 [options]'\033[0m"
echo -e "\033[34moptions:\033[0m"
echo -e "\033[34m-m\033[0m : Specify using 'ctags ${more_options}'."
echo -e "\033[34m-p find_path\033[0m : Specify the find path."
echo " The default value is current dir."
echo -e "\033[34m-i ignore_path\033[0m : Specify the ignore dir names to process."
echo " The default value is all the dir names related to version."
echo -e "\033[34m-u used_path\033[0m : Specify the dir names which will be removed from the ignored dir names."
echo " The default value is 'arch-v5 armv8-a dsp-v3 ai-v2'."
echo "========================================"
}
while getopts "mp:i:u:h" opt; do
case $opt in
m) ctags="ctags ${more_options}";;
p) find_path=$OPTARG;;
i) ignore_path=$OPTARG;;
u) used_path=$OPTARG;;
h) usage; exit 0;;
*) echo "Error option: -$opt"; usage; exit 1;;
esac
done
for i in ${used_path}; do
ignore_path=$(echo "${ignore_path}" | sed -e "s:^${i} ::" -e "s: ${i} : :" -e "s: ${i}$::")
done
start_time_sec=`date +%s`
cmd=$(echo ${ctags} \$\(find ${find_path} -path \'*/.git\' -prune \
$(echo "${ignore_path}" | sed "s:\([*a-zA-Z0-9_\-]\+\):-o -path '*/\1' -prune:g") \
$(echo "${find_suffix}" | sed 's:\([*a-zA-Z0-9_+\-]\+\):-o -iname "*.\1" -print:g')\))
cd `pwd`
eval $cmd
end_time_sec=`date +%s`
echo -e "\033[34mCost $(( $end_time_sec - $start_time_sec )) seconds.\033[0m"
echo -e "\033[32m$cmd\033[0m"
grep [options] [grep_str] [file1] [file2] ...
文件名: 匹配行
-r
选项合用,表示递归搜索当前文件夹下的所有字符串grep -G
: 表示使用基本正则表达式,默认行为
grep -E
or egrep
: 表示使用扩展正则表达式grep -P
: 表示使用 Perl 正则表达式grep -F
: 表示不使用正则表达式grep -f file
: 从文件中获取搜索的字符串的样式,每个样式一行,相当于与逻辑grep -e "pattern1" -e "pattern2"
: 同时匹配,等价于 grep "pattern1" | grep "pattern2"
-r
or -R
: 递归搜索,-r
不会解符号链接,而 -R
会--include=GLOB
: 包含某些文件,GLOB 表示可使用通配符,例如: grep -rn "\<malloc\> *(" ./ --include=*.{c,cpp,h}
--exclude=GLOB
: 排除某些文件--exclude-dir=GLOB
: 排除某些文件夹-i
: 忽略大小写-v
: 反向匹配-w
: 精确匹配单词-x
: 精确匹配行-n
: 输出匹配行的行号,输出 文件名:行号: 匹配行
-c
: 只列出匹配多少行,并不是匹配的次数,相当于 grep -x "xxx" | wc -l
-l
: 只输出有匹配的文件列表,而不是匹配的行,-L
相反-o
: 只输出匹配部分的字符串,一行有多个匹配会输出多行,例如: echo this is a line. | egrep -o "[a-z]+\."
输出 line.
-q
: 静默模式,无任何输出,命令运行结果 $?
: 匹配到会返回 0,否则返回 1-A
/ -B
/ -C
: 输出匹配行的周边行,选项后面可加数字,A / B / C
分别表示除了列出匹配行外,后面 / 前面 / 两面
的n行也列出来ag [options] pattern [path ...]
grep -rni
,但执行效率比 grep 高sudo apt install silversearcher-ag
-a
: 搜索(不包括隐藏文件和忽略文件的)全部文件-s
: 大小写敏感-f
: 解符号链接--workers NUM
: 多线程搜索-g GLOB
: 打印和 GLOB 匹配(匹配一部分即可)的文件路径名-G GLOB
: 仅搜索与 GLOB 匹配(匹配一部分即可)的文件名中的内容--ignore GLOB
: 搜索排除与 GLOB 匹配文件或文件夹-v
-w
-c
-l
-L
-o
-A
-B
-C
等选项意义同 grep./grep.sh [grep_str]
or ./grep.sh [options]
,可使用 ./grep.sh -h
查看详细帮助信息ignore_path
used_path
对应他自己的工程#!/bin/bash
grep_option=
grep_str=
grep_path=
ignore_path="arch-v1 arch-v2 arch-v3 arch-v4 arch-v5 armv7-a-hf armv8-a dsp-v1 dsp-v2 dsp-v3 ai-v1 ai-v2 linux* out"
used_path="arch-v5 armv8-a dsp-v3 ai-v2"
grep_suffix="c cc cp cxx cpp CPP c++ C h hh hp hxx hpp HPP h++ H"
usage() {
echo "========================================"
echo -e "\033[34mUsage: '$0 grep_str' or '$0 [options]'\033[0m"
echo -e "\033[34moptions:\033[0m"
echo -e "\033[34m-o grep_option\033[0m : Specify the additional grep options. for example: -o '-w'."
echo -e "\033[34m-s grep_str\033[0m : Specify the grep string."
echo -e "\033[34m-p grep_path\033[0m : Specify the grep path."
echo " The default value is current dir."
echo -e "\033[34m-i ignore_path\033[0m : Specify the ignore dir names to process."
echo " The default value is all the dir names related to version."
echo -e "\033[34m-u used_path\033[0m : Specify the dir names which will be removed from the ignored dir names."
echo " The default value is 'arch-v5 armv8-a dsp-v3 ai-v2'."
echo -e "\033[34m-x grep_suffix\033[0m : Specify the filename suffix to grep."
echo " The default value is the C/C++ source code suffix."
echo "========================================"
}
if [ $# -eq 0 ]; then
usage
exit 1
elif [ $# -eq 1 ] && [[ $1 != '-h' ]]; then
grep_str=$1
else
while getopts "o:s:p:i:u:x:h" opt; do
case $opt in
o) grep_option=$OPTARG;;
s) grep_str=$OPTARG;;
p) grep_path=$OPTARG;;
i) ignore_path=$OPTARG;;
u) used_path=$OPTARG;;
x) grep_suffix=$OPTARG;;
h) usage; exit 0;;
*) echo "Error option: -$opt"; usage; exit 1;;
esac
done
fi
for i in ${used_path}; do
ignore_path=$(echo "${ignore_path}" | sed -e "s:^${i} ::" -e "s: ${i} : :" -e "s: ${i}$::")
done
start_time_sec=`date +%s`
cmd=$(echo grep -rn --color=auto ${grep_option} \"${grep_str}\" ${grep_path} --exclude-dir=.git \
$(echo "${ignore_path}" | sed 's:\([*a-zA-Z0-9_\-]\+\):--exclude-dir=\1:g') \
$(echo "${grep_suffix}" | sed 's:\([*a-zA-Z0-9_+\-]\+\):--include=*.\1:g'))
cd `pwd`
eval $cmd
end_time_sec=`date +%s`
echo -e "\033[34mCost $(( $end_time_sec - $start_time_sec )) seconds.\033[0m"
echo -e "\033[32m$cmd\033[0m"
sed [options] 'pattern command' [file1] [file2] ...
pattern command
必须用单引号或双引号括起来,双引号会对表达式求值\n
pattern
(可选) 是否匹配,如果没有提供样式,那么所有的行都是匹配的-n
取消此默认行为),接着清空模式空间sed -e 'pattern command'
: 从命令行获取命令的样式,默认选项,只有一个命令时可以省略 -e
sed -e 'expression' -e 'expression'
or sed 'expression' | sed 'expression'
or sed 'expression; expression'
sed -f file
: 从文件中获取命令的样式sed -E
or sed -r
: 支持扩展正则表达式,不加此选项时扩展正则表达式符号要加反斜杠 \
转义
--debug
: 调试 sed-n
: 不打印模式空间的行,例如: sed -n '2p' filename
表示只打印 filename 文件的第2行-i
: 在文件中直接修改文件内容,不加此选项时默认打印到屏幕匹配样式(pattern)
n
: 匹配第n行,其中 1
是首行,$
是尾行n,m
: 匹配第n行(含)到第m行(含)之间的行n,+m
: 匹配第n行(含)之后的共m行n,~m
: 匹配第n行(含)直到到后面第一个行号被m整除(含)之间的行/regexp/
: 匹配包含正则表达式 regexp 的行\cregexpc
: 匹配包含正则表达式 regexp 的行,c是定界符,可换成其它字符/regexp/,n
: 匹配从与 regexp 匹配的行(含)到第n行(含)之间的行,可以匹配多次n,/regexp/
: 匹配从第n行(含)到第一个与 regexp 匹配的行(含)之间的行,如果第n行后的行都与 regexp 不匹配,将匹配到文件结尾n,m!
: 匹配不是第n行到第m行之间的行,上面的匹配都可以加感叹号 !
匹配取反执行命令(command)
p
: 打印行,打印模式空间,通常 p
会与参数 sed -n
一起运行d
: 删除行,清空模式空间,模式空间只有一行时 d
D
作用相同i text
: 插入行,在当前行的上一行插入内容为 text 的行a text
: 追加行,在当前行的下一行追加内容为 text 的行c text
: 取代行, 使用内容为 text 的行取代当前行(i
a
c
命令可写成两行,第一行加 \
转义换行)D
: 删除行,删除模式空间中的内容直到第一个换行符,并使用生成的模式空间重新开始循环,而不读取新的输入行e
: 执行命令,执行在模式空间中找到的命令并用输出替换模式空间(不带尾随换行符被抑制)e command
: 执行命令,执行命令并将其输出发送到输出流,该命令可以跨多行运行,除了最后一行以反斜杠结尾F
: 打印文件名,打印当前输入文件的文件名(带尾随换行符)=
: 打印行号,打印当前输入的行号(带尾随换行符)P
: 打印行,打印模式空间中的内容直到第一个换行符r file
: 追加文件,在当前行的下一行追加 file 文件的内容R file
: 追加文件行,在当前循环结束时或在读取下一个输入行时,将要读取的文件的一行插入到输出流中w file
: 另存文件,将当前模式空间的内容写入到另外的文件W file
: 另存文件,将当前模式空间空间中的内容直到第一个换行符写入到另外的文件h
: 把模式空间内容覆盖到保持空间中H
: 把模式空间内容追加到保持空间中g
: 把保持空间内容覆盖到模式空间中G
: 把保持空间内容追加到模式空间中x
: 交换模式空间与保持空间的内容z
: 情况模式空间的内容sed -i 's/regexp/replace/g'
s
,关键字前面还可以加行范围/
作为区域分隔字符,也可以使用其他任意字符-i
选项g
, 如果要替换该行的第n处匹配开始之后所有的匹配,需要在命令尾部加上参数 ng
sed -i .bak 's/regexp/replace/g' filename
保存更改到原文件,并创建备份文件 filename.baksed -i '1,10s/\<malloc\>[ \t]*([ \t]*/calloc(1, /g' file
# 表示 file 文件的前10行的所有 malloc 函数替换成 calloc 函数&
&
是已匹配字符串标记,代表前面匹配的字符串echo Leng Jing | sed 's/\w\+/[&]/g'
输出为 [Leng] [Jing]
\n
\n
,\1
表示第1个子串,\2
表示第2个子串,依此类推...echo Leng Jing | sed 's/\(\w\+\) \(\w\+\)/\2 \1/'
or echo Leng Jing | sed -E 's/(\w+) (\w+)/\2 \1/'
输出为 Jing Leng
sed -n '/\<malloc\>/p' file
: 表示打印 file 文件含有 malloc 单词的行sed -n '1,10p' file
: 表示打印 file 文件的前10行sed -i '1,10d' file
: 表示删除 file 文件的前10行sed -i '/^[ \t]*$/d' file
: 表示删除空白行sed -i 'a \\\\' file
: 表示 file 文件的每一行之后都增加新的空行sed -i '$ a abcdsfg' file
: 表示 file 文件的最后一行之后增加新的行 "abcdsfg"sed -i '1i #!/bin/bash' file
: 表示 file 文件第1行之前增加新行,该行字符串为 "#!/bin/bash"sed -i 'c hello' file
: 表示 file 文件的每一行都替换成了 "hello"./rename.sh [replace] [olddefs] [defvars]
,例如: ./rename.sh "ENV_ARCH" "CONFIG_ARCH CONFIG_VERSION" "V1 V2"
CONFIG_ARCH
CONFIG_VERSION
CONFIG_ARCH
CONFIG_VERSION
-DCONFIG_ARCH_$(CONFIG_ARCH)
-DCONFIG_VERSION_$(CONFIG_VERSION)
CONFIG_ARCH_V1
CONFIG_ARCH_V2
CONFIG_VERSION_V1
CONFIG_VERSION_V2
#!/bin/bash
do_rename() {
replace=$1
olddefs=$2
defvars=$3
for i in ${olddefs}; do
for j in ${defvars}; do
str=${i}_${j}
files=$(grep -rwl "${str}" | xargs)
if [ ! -z "${files}" ]; then
echo -e "\033[32mRename ${str}\033[0m"
echo ${files}
sed -i "s/\<${str}\\>/${replace}_${j}/g" ${files}
fi
done
str=D${i}_
files=$(grep -rwl "${str}" | xargs)
if [ ! -z "${files}" ]; then
echo -e "\033[32mRename ${str}\033[0m"
echo $files
sed -i "s/\<${str}\\>/D${replace}_/g" ${files}
fi
str=${i}
files=$(grep -rwl "${str}" | xargs)
if [ ! -z "${files}" ]; then
echo -e "\033[32mRename ${str}\033[0m"
echo $files
sed -i "s/\\<${str}\>/${replace}/g" ${files}
fi
done
}
do_rename "$1" "$2" "$3"
awk [options] 'BEGIN{commands} pattern{commands} END{commands}' [file1] [file2] ...
BEGIN{commands}
、主体块 pattern{commands}
、结束块 END{commands}
,都是可选的BEGIN
和 END
是关键字,匹配样式 pattern
可以是正则表达式、条件语句以及行匹配范围等;
分隔,支持条件语句和循环语句,支持各种运算,变量引用不需要加美元符 $
BEGIN {commands}
语句块(可选)中的语句pattern
(可选) 是否匹配,如果没有提供样式,那么 awk 就认为所有的行都是匹配的{commands}
中的语句(可选),如果不提供该语句块,则默认执行 { print }
,即打印所读取到的每一行END {commands}
语句块(可选)中的语句print var1,var2
or print var1 var2
: print 会自动增加换行符 ,参数以逗号进行分隔时,打印后多个参数间是空格分隔;以空格进行分隔时,打印后多个参数间没有分隔printf "format",var1,var2
: printf 不会自动增加换行符,是格式化打印echo abc | awk '{print 100 ":" $0}'
or echo abc | awk '{printf "%d:%s\n",100,$0}'
or echo abc | awk '{print sprintf("%d:%s",100,$0)}'
都输出 100:abc
awk -f awk_script
: 执行 awk_script 脚本文件-F separator
: 指定分隔符,可以是字符串或正则表达式,默认分隔符是(1个或多个)空格,分隔符分开的每一项称为一个域(字段)-v var1=value1 var2=value2 ...
: 定义用户变量NR==n
: 匹配第n行,还支持 !=
<
<=
>
>=
等其它运算符,也可以使用运算再条件判断,例如: awk 'NR % 2 == 0'
NR==n,NR==m
: 匹配第n行(含)到第m行(含)之间的行/regexp/
: 匹配包含正则表达式 regexp 的行/regexpn/,/regexpm/
: 匹配包含正则表达式 regexpn(含) 到 regexpm(含)之间的行/regexp/,n
: 匹配从与 regexp 匹配的行(含)到第n行(含)之间的行,可以匹配多次n,/regexp/
: 匹配从第n行(含)到第一个与 regexp 匹配的行(含)之间的行,如果第n行后的行都与 regexp 不匹配,将匹配到文件结尾!/regexp/
: 匹配不包含正则表达式 regexp 的行,上面的匹配都可以加感叹号 !
匹配取反=
+=
-=
*=
/=
%=
^=
**=
: 赋值?:
: C条件表达式||
: 逻辑或&&
: 逻辑与~
!~
: 判断匹配/不匹配后面的正则表达式 /regexp/
<
<=
>
>=
!=
==
: 关系运算符
: 空格,连接符,可连接字符串+
-
: 加 减*
/
%
: 乘 除 余+
-
!
: 一元加 减 逻辑非^
***
: 求幂++
--
: 自增 自减,作为前缀或后缀$
: 字段引用in
: 是否是数组成员break
和 continue
)
if (condition) { commands } else if (condition) { commands } else { commands }
: if 条件语句for (init_clause; cond_expression; iteration_expression)
: for 循环语句,例如: len = length(array); for (i=1; i<=len; i++) {print array[i]}
for (var in array) { commands }
: for-in 循环语句,例如: for (i in array) {print array[i]}
while (condition) { commands }
: while 循环语句do { commands } while (condition)
: do-while 循环语句FILENAME
: 当前处理的文件名,没有文件时值是 -
NR
: Number of Record,已经读出的记录数,即行号,从1开始FNR
: 多文件操作时,新打开文件时 FNR 会重新从1开始,而 NR 则不会NF
: Number for Field,当前记录中的字段个数$0
: 当前记录,即当前行的文本内容$1
$2
...
: 当前记录中的第 1 / 2 /...
个字段的文本内容,最后一个字段用 $NF
, 倒数第2个字段用 $(NF‐1)
RS
: Record Separator,输入记录的分隔符,默认是换行符FS
: Field Separator,输入字段的分隔符,默认是空格符ORS
: Out of Record Separator,输出记录的分隔符,默认是换行符OFS
: Out of Field Separator,输出字段的分隔符,默认是空格符IGNORECASE
: 设为1时忽略大小写asort(source[,dest[,how ]])
asorti(source[,dest[,how ]])
asort
按数组 source
的值排序,且将数组的索引替换为从1开始的连续整数,数组的值还是原来的值asorti
按数组 source
的索引排序,且将数组的索引替换为从1开始的连续整数,数组的值是原来的索引dest
参数时,将排序后的值保存到 dest
,否则直接在 source
上排序保存how
使用自定义函数排序,使用时函数名要用双引号包含,函数定义为 function cmp_name(i1, v1, i2, v2)
,其中 i
表示索引,v
表示值echo | awk '{a[1]="orange"; a[3]="apple"; a[4]="pear"; asort(a); for (i in a) printf "[%d:%s]",i,a[i]} END{print ""}'
输出 [1:apple][2:orange][3:pear]
echo | awk '{a[1]="orange"; a[3]="apple"; a[4]="pear"; asorti(a); for (i in a) printf "[%d:%s]",i,a[i]} END{print ""}'
输出 [1:1][2:3][3:4]
sub(regexp,replace[,str])
gsub(regexp,replace[,str])
gensub(regexp,replace,how[,str])
sub
将字符串 str
中正则表达式 regexp
匹配到的第1处内容替换成字符串 replace
gsub
将字符串 str
中正则表达式 regexp
所有匹配到的内容替换成字符串 replace
gensub
将字符串 str
中正则表达式 regexp
匹配到的指定位置的内容替换成字符串 replace
replace
中可用 &
表示匹配到的字符串str
时缺省值是当前记录 $0
gensub
中的 how
为 g
/ G
时替换所有匹配到内容,为数字时替换匹配到的第 how
处内容echo axbxc | awk '{var=gsub(/x/,"|&|"); print var ":" $0}'
输出 2:a|x|b|x|c
length([str])
str
的长度str
时缺省值是当前记录 $0
,也可以省略小括号echo abcdefg | awk '{print length}'
输出 7
substr(str,start[,len])
str
的子串start
(含),提取 len
个字符len
时输出直到结尾df -h | awk '{if (int(substr($5,1,length($5)-1)) > 80) print $0}'
输出空间占用大于 80 的磁盘index(str,substr)
substr
在字符串 str
出现的位置echo abcdefg | awk '{print index($0,"cd"),index($0,"hi")}'
输出 3 0
match(str,regexp)
regexp
在字符串 str
首次匹配的位置RSTART
特殊变量设置为位置编号,否则设置为 0RLENGTH
特殊变量设置为匹配的字符串的长度,否则设置为 -1echo 'Hello World!' | awk '{ret=match($0,/\w+/); print ret,RSTART,RLENGTH}'
输出 1 1 5
echo 'Hello World!' | awk '{ret=match($0,/abc/); print ret,RSTART,RLENGTH}'
输出 0 0 -1
split(str,array[,delimiter[,seps]])
patsplit(str,array[,regexp[,seps]])
split
使用定界符 delimiter
将字符串 str
切割成子字符串数组存入 array
,返回分割后的元素总数patsplit
使用正则表达式 regexp
提取字符串 str
匹配的子字符串数组存入 array
,返回提取后的元素总数split
不指定 delimiter
时默认使用输入字段的分隔符 FS
seps
是 gawk 扩展,保存 str
中的分隔的/不匹配的字符串为数组echo a:b:c | awk '{split($0,array,":"); for (i in array) printf "%s",array[i]} END{print ""}'
输出 abc
echo ab:cd:ef:g | awk '{patsplit($0,array,/\w+/); for (i in array) printf "(%s)",array[i]} END{print ""}'
输出 (ab)(cd)(ef)(g)
sprintf(format,var1,var2,...)
echo | awk '{var=sprintf("%s = %lf","PI",3.1415926);print var}'
输出 PI = 3.141593
tolower(str)
toupper(str)
echo aXbXc | awk '{print tolower($0) " | " toupper($0)}'
输出 axbxc | AXBXC
strtonum(str)
str
并返回其数值,0
开头是八进制数,0x
0X
开头是八进制数int(x)
: 取整,也可以转化 "strnum"
型的字符串srand([x])
: 将生成随机数的种子设置为值 x,x被省略则当前日期和时间用于种子rand()
: 随机数,返回0到1之间的随机数,例如: echo | awk '{srand();print rand()}'
sin(x)
: 正弦cos(x)
: 余弦atan2(y, x)
: 反正切sqrt(x)
: 平方根log(x)
: 对数exp(x)
: e指数 e ^ x
lshift(val,count)
: 左移rshift(val,count)
: 右移compl(val)
: 补码and(v1,v2[,…])
: 位与or(v1,v2[,…])
: 位或xor(v1,v2[,…])
: 位异或isarray(x)
: 是数组typeof(x)
: 返回类型字符串 "number"
"strnum"
"string"
"array"
"regexp"
"unassigned"
"untyped"
close(filename[,how])
: 关闭文件或管道fflush([filename])
: 刷新缓冲systime()
: 返回 UTC 时间戳mktime(datespec[,utc-flag])
: 字符串转换为时间戳,utc-flag
为时区strftime([format[,timestamp[,utc-flag]]])
: 时间戳格式化为字符串system(command)
awk 'BEGIN{var=system("ls -al");print var}'
[expression |] getline [var]
or getline [var] [< file]
: 设置变量
expression
输出或文件 file
内容的下一个记录赋值给变量 var
$0
记录变量设置为该记录的值,还将设置 NF
、NR
和 FNR
特殊变量awk 'BEGIN{while ("cat /etc/passwd"|getline) {print $0}; close("/etc/passwd")}'
awk 'BEGIN{while (getline < "/etc/passwd") {print $0}; close("/etc/passwd")}'
awk -f awk_script [file1] [file2] ...
执行 awk_script 脚本文件#
作为注释BEGIN
前自定义函数 function fname(param1,param2) { commands }
for-in
遍历的是数组的索引echo | awk '{var1="v1"; var2="v2"; var3="v3"; print var1,var2,var3}'
: 输出 v1 v2 v3
echo | awk 'BEGIN{OFS="_"} {var1="v1"; var2="v2"; var3="v3"; print var1,var2,var3}'
: 输出 v1_v2_v3
echo | awk '{var1="v1"; var2="v2"; var3="v3"; print var1 "-" var2 "-" var3}'
: 输出 v1-v2-v3
awk 'NR < 3'
: 打印行号小于3的行,即第1行和第2行awk '!/linux/'
: 打印不包含 linux 的行echo "a.o: a.c a.h b.h" | awk '{$2="\b";print $0}'
: 输出 a.o: a.h b.h
,即删除了第2个字段cat /etc/passwd | awk -F ':' '{print $1"\t"$7}'
: 输出账户名和对应的 shell,以制表符分隔var1="Variable1" ; var2="Variable2"; echo | awk '{print v1,v2}' v1=$var1 v2=$var2
: 输出 Variable1 Variable2
echo -e "1\n 2\n 3\n 4" | awk 'BEGIN{num=0;} {sum+=$1; print $1" +"} END{print "="; print sum}' | xargs echo | sed 's/+ =/=/g'
: 输出 1 + 2 + 3 + 4 = 10
ls -l | awk 'BEGIN{size=0;} {size=size+$5;} END{print "Total size is",size/1024,"KB"}'
: 统计当前文件夹所有文件的总大小./words.sh [filename] [sortop]
#!/bin/bash
if [ $# -ne 1 ] && [ $# -ne 2 ] ; then
echo "Usage: $0 filename"
echo " $0 filename sort_option"
exit -1
fi
filename=$1
egrep -o '\b\w+\b' $filename | \
awk -v opt=$2 '
function cmp_num(i1, v1, i2, v2)
{
return (v1 - v2)
}
function rcmp_num(i1, v1, i2, v2)
{
return (v2 - v1)
}
{
count[$0]++
}
END {
if (opt == 1) {
asorti(count,dst,"rcmp_num")
} else if (opt == 2) {
asorti(count,dst,"cmp_num")
} else {
asorti(count,dst)
};
printf("%-20s%s\n","Word","Count");
for (i in dst) {
printf("%-20s%d\n",dst[i],count[dst[i]])
}
}
'
xargs
: 定界符转换
/bin/echo
find -name *.o | xargs rm -f
-n num
: 表示 num 个元素之后另起一行-d separator
: separator 是单个字符,表示这个字符作为定界符,例如: echo "AXBXCX" | xargs -d X
-i
: 表示在 {}
表示的指定位置替换参数,否则参数位置是末尾tr set1 set2
: 字符映射
cat a.txt | tr 'A-Z' 'a-z' > a.txt
or tr '[:upper:]' '[:lower:]'
将输入字符由大写转换成小写cat a.txt | tr '\t' ' ' > a.txt
将制表符转化为四个空格cat test.txt | tr 'a-zA-Z' 'n-za-mN-ZA-M' > encryption.txt; cat encryption.txt | tr 'n-za-mN-ZA-M' 'a-zA-Z' > decryption.txt
ROT13 加解密tr [options] set
: 字符处理
-d
: 后面接要删除的字符集合-c
: 后面接要保留的字符集合-s
: 后面接要压缩的字符集合echo "Hello 123 world 456" | tr -d '0-9' | tr -s ' '
删除数字压缩空格cat file | tr -c '0-9'
获取文件中所有数字col [options]
: 字符转换
-x
: 将 tab 键转换成对等的空格键-b
: 在文字内有反斜杠时,仅保留反斜杠接的那个字符cut [options] [filename]
: 切割文本
-c filed
: 提取特定范围的字符-b filed
: 提取特定范围的字节,这些字节位置将忽略多字节字符边界,除非也指定了 -n
标志-f filed
: 提取特定范围的字段-d separator
: 指定字段的分隔符,默认的字段分隔符为 Tab
N1,N2,N3...
: 提取第N1,N2,N3...个字符、字节或字段,例如: cut -f 2,3 filename
表示提取第2列和第3列N-
: 从第N个(含)字符、字节或字段到行尾,序号从1开始N-M
: 从第N个(含)字符、字节或字段到第M个(含)字符、字节或字段-M
: 从第1个(含)字符、字节或字段到第M个(含)字符、字节或字段--complement
: 对提取的字段进行补集运算--output-delimiter
: 后面接新的分割字符,输出使用新的分割字符sort [options] [filename]
: 排序
-r
: 逆序-n
: 按数字顺序排序-d
: 以字典序进行排序-t separator
: 指定排序时所用的栏位分隔字符,默认情况下,键就是文本文件中的列,列与列之间用空格分隔-k num
: 按第 num 列参数的值进行排序-m
: 排序合并文件-b
: 忽略文件中的前导空白行uniq [options]
: 消除相邻的重复行,常和 sort
连用
-u
: 只显示唯一的行-d
: 找出重复的行-c
: 统计各行出现的次数-s num
: 指定可以跳过前 num 个字符-w num
: 指定用于比较的最大字符数comm [options] file1 file2
: 求集合,常和 sort
连用
-1
删除 file1 独有的行,-2
删除 file2 独有的行, -3
删除 file1 共有的行join [options] file1 file2
: 联合,常和 sort
连用
-t separator
: 指定栏位分隔字符-i
: 忽略大小写的差异-1 num
: 代表第1个文件要用哪个字段来分析的意思-2 num
: 代表第2个文件要用哪个字段来分析的意思paste [options] file1 file2
: 拼接
-d separator
: 后面可以接分隔字符,默认是以 TAB 来分隔-
: 如果 file 部分写成 -
,表示来自 stdin 的数据的意思wc
: 统计
-l
: 统计行数-w
: 统计单词数-c
: 统计字符数-L
: 打印出文件中最长一行的长度,例如: wc -L file
cat
cat file
: 显示全部文件内容cat file1 file2 file3 > file
: 拼接文件echo 'Text through stdin' | cat - file1 > file
: 拼接输入和文件,减号 -
被作为 stdin 文本的文件名EOF
是标识符,也可以使用其它任意字符串作为标识符,导入的文件内容直到某行字符串等于标志符结束>
表示清空文件再写,>>
表示追加到文件cat <<EOF> file
...
EOF
cat <<EOF>> file
...
EOF
cat <<'EOF'> file
...
EOF
cat <<'EOF'>> file
...
EOF
-s
: 压缩空行,连续空行合并为一行-b
: 列出行号,空白行不列出-n
: 列出行号,空白行也列出-A
: 相当于 -vET
-v
: 列出特殊字符-E
: 显示结尾断行字符 $
-T
: 制表符以 ^I
显示tac
nl
od
more
/ less
more
只能向后翻页,less
可以向前向后翻页[Space]
向下翻一页; [Enter]
向下翻一行; b
或 [Ctrl]+b
往回翻(不适用于管道文件); q
离开/string
向下搜这个字符串; ?string
向上搜这个字符串; n
继续搜索; N
反向继续搜索head
-n num
: 列出前面 num 行,数字为负数为后面 num 行不列出tail
-n num
: 列出后面 num 行,数字为负数为前面 num 行不列出-f
: 持续监测文件,例如: tail -f /var/log/syslog
等效 dmesg -w
pwd
: 显示当前目录
ls [options] [filename]
: 文件清单
-l
: 详细信息-a
: 隐藏文件也列出,包括 .
和 ..
-A
: 隐藏文件也列出,不包括 .
和 ..
-d
: 不列出目录内容-R
: 递归式操作-h
: 将文件容量以 GB MB KB 等列出-t
: 按时间排序,新的在前ls -d */
or ls -F | grep "/$"
or ls -l | grep "^d"
or find . -maxdepth 1 -type d -print
列出当前目录下的目录cd [dirname]
: 切换目录
/
根目录 .
当前目录 ..
上一层目录 -
前一工作目录 ~
当前用户家目录 ~lengjing
用户 lengjing 家目录cd /xxx/xxx/...
进绝对路径目录 ; cd ./xxx/xxx/...
进相对路径目录mkdir [options] [dirname]
: 创建目录
-m n1n2n3
: 设权限-p
: 上层目录没有也会递归创建,文件存在也不报错rmdir [options] [dirname]
: 删除空目录,目录有文件要用 rm -r
-p
: 连上一层空目录也删除,一直到不是空目录停止stat [filename]
: 显示文件信息
file [filename]
: 查看文件类型
touch [filename]
: 新建空文件
touch -a
只更改文件访问时间,touch -m
只更改文件修改时间。mktemp
: 生成一个临时文件并返回其文件名
X
),X
会被随机的字符(字母或数字)替换-d
: 生成一个临时目录并返回其文件名-u
: 生成文件名,不创建实际的文件或目录cp [options] [srcs] [dst]
: 复制文件,srcs 可以是多个项目
-r
: 递归复制-f
: dst 无法打开时,删除 dst 再试复制-d
: 符号链接指向的文件不存在时也可以复制-p
: 连同属性也复制(备份常用),包含 -d
作用-i
: 询问是否覆盖-a
: 保留属性,递归的复制-s
: 创建符号链接,也可以用 ln -s
创建符号链接mv [options] [srcs] [dst]
: 移动文件,可以用来重命名,srcs 可以是多个项目
-f
: 同名档案直接覆盖-p
: 保持权限-i
: 询问是否覆盖-u
: 比已有文件新则覆盖(update)rm [options] [filename]
: 删除文件,命令删除是没有回收站的
-r
: 递归地删除(常用于删除有文件的目录)-f
: 忽略文件不存在时的警告信息-i
: 询问是否删除ln [options] [src] [dst]
: 给文件或目录创建链接
basename $src
-f
: 如果目标文件存在时,就主动的将目标文件直接移除后再创建,文件夹还要加上 -T
-s
: 添加符号链接,如果不加任何参数就进行硬链接gzip/gunzip/zcat
bzip2/bunzip2/bzcat
xz/unxz/xzcat
-z
强制压缩 / -d
强制解压 / -t
测试压缩文件 / -l
列出压缩信息-z
选项-1
...-9
: 设置压缩等级,默认是 -6,压缩最高是 -9-k
: 保留输入文件(压缩解压默认会删除原文件)-f
: 强制覆盖输出文件-h
: 帮助信息-v
: 显示进度等信息-T <num>
: 多线程支持(仅 xz 族命令)tar
tar -[Jjz] -c -f [tarname] -C [dir] [objects]
tar -x -f [tarname] -C [dir]
tar -t -f [tarname]
tar -Jcvf test.tar.xz test
-
(Traditional Style),例如: tar Jcvf test.tar.xz test
-J
: xz 打包压缩,此时 tarname 需要命名为 *.tar.xz
-j
: bz2 打包压缩,此时 tarname 需要命名为 *.tar.bz2
-z
: gzip 打包压缩,此时 tarname 需要命名为 *.tar.gz
-c
: 压缩-x
: 解压-t
: 查看-f [tarname]
: 打包文件名-C [dir]
: 进入指定目录打包(否则包含路径)或解压到指定目录(否则当前目录)-P
: 保留绝对路径-v
: 显示处理信息-p
: 保留属性-P
: 保留绝对路径split [options] [filename] [prefix]
: 分割文件
-x
: 以数字命名后缀而不是字母命名-a num
: 指定分割的后缀的位数 num
,默认2位,prefix
为前缀名称-b value
: 多大一个文件,单位有: c
1 byte; w
2 bytes; b
512 bytes; k
1024 bytes; M
1024k bytes; G
1024M bytes-l num
: 多少行一个文件-n CHUNKS
: 分割成指定个文件
N
: 均分为 N 个文件l/N
: 约均分为 N 个文件,但分割位置不会拆分行K/N
: 打印均分为 N 份时的第 K 份内容到屏幕l/K/N
: 打印约均分为 N 份时的第 K 份内容到屏幕r/N
: 类似 l/N
,但是使用 round robin distribution
r/K/N
: 类似 l/K/N
,但是使用 round robin distribution
csplit [options] [filename] [pattern...]
: 匹配分割文件
-b suffix
: 设置后缀格式,可用格式化输出符,例如 %04d.txt
-f prefix
: 设置前缀字符串,默认是 xx
-n num
: 指定分割的后缀的位数 num
,默认2位-s
: 静默模式,不显示输出文件的尺寸计数N
: 复制至指定行(不含)一个文件,其它又一个文件/regexp/offset
: 复制至匹配行(不含)一个文件,其它又一个文件,offset
可选,可用正 +N
负 -N
整数%regexp%offset
: 跳过直至匹配行(不含)丢弃内容,其它又一个文件{N}
: 将之前指定的模式重复 N 次{*}
: 将之前指定的模式重复尽可能多的次数drwxr-xr-x 34 lengjing lengjing 4096 Aug 20 10:07 lengjing/
档案类型
d
目录 -
文件 l
链接b
区块设备(硬盘等) c
字符设备(键盘鼠标等) s
数据接口文件(sockets) p
数据输送文件(FIFO)所有者权限
所属群组权限
其他用户权限
r
可读(read) w
可写(write) x
可执行(execute) -
无权限连接数
,表示有多少档名连结到此节点(i-node)(目录下文件数,包括 .
和 ..
)所有者
所属群组
容量大小
(默认单位为 bytes) 最后修改时间
档案名称
Ext4
/ Ext3
文件系统,单一档名可达 255 字符,完整文件名(包含路径)可达 4096 个字符.
开头的档名,表示这个档案为隐藏档案4
为 SUID
(Set UID)
s
时为 SUID
权限2
为 SGID` (Set GID)
s
时为 SGID
权限1
为 SBIT
(Sticky Bit)
t
或 T
时为 SBIT
权限(粘滞位),典型例子就是 /tmp
$ ls -ld /tmp /usr/bin/passwd
drwxrwxrwt 13 root root 4096 8月 9 11:27 /tmp
-rwsr-xr-x 1 root root 59640 3月 23 2019 /usr/bin/passwd
chmod
: 更改权限
chmod u+x configure
或 chmod 744 configure
给 configure 文件加上可执行权限chmod a+t dir
设置 SBITchmod +s binname
设置 SUIDchattr +i file
chattr -i file
设置文件不可修改和取消设置chmod [usertype sign type] [filename] 或 chmod [n1n2n3] [filename]
u用户 +添加 r可读 r=4 w=2 x=1
g同组 -取消 w可写
o其他 =赋予 x可执行
a所有(可省略)
chown [owner] [filename]
: 修改所有者chown [owner:grouper] [filename]
: 同时修改所有者和组chgrp [grouper] [filename]
: 修改所有组注: 这四个 chxxx
命令都可以用 -R
选项进行递归式操作
superblock
: 记录此 filesystem 的整体信息
inode
: 记录文件的属性
block
: 实际记录文件的内容
注: 可以将一个分割槽格式化为多个文件系统(LVM),也能够将多个分割槽合成一个文件系统(RAID),linux 采用索引式文件系统,基本上不太需要常常进行碎片整理
df [options] [filename or dirname]
-a
: 列出所有的文件系统,包括系统特有的 /proc
等文件系统-h
: 以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示容量-k
: 以 KBytes 列出容量显示-m
: 以 MBytes 列出容量显示-H
: 以 M=1000K 取代 M=1024K 的进位方式-T
: 连同文件系统类型也列出-i
: 不用容量,而以 inode 的数量来显示du [options] [filename or dirname]
-a
: 列出所有的文件与目录容量,默认仅统计当前目录底下的文件量而已-h
: 以人们较易读的容量格式 (G/M) 显示-k
: 以 KBytes 列出容量显示-m
: 以 MBytes 列出容量显示-s
: 列出总量而已,而不列出每个各别的目录占用容量-S
: 不包括子目录下的总计mount [-t fstype] [-L Label ] [-o extra_options] [-n] [devname] [mountdir]
sudo mount -o remount,rw,auto /
sudo mount -t ntfs /dev/sda2 /home/ntfspd
sudo mount -t nfs <ip_addr>:<path> <mount_path> -o nolock -o tcp -o rsize=32768,wsize=32768
sudo mount -t cifs //<ip_addr>/<path> <mount_path> -o domain=<str1>,username=<str2>,password=<str3>,vers=1.0,uid=1000,gid=1000
umount [options] [devname or mountdir]
-f
: 强制卸载,可用在类似网络文件系统 (NFS) 无法读取到的情况下-n
: 不升级 /etc/mtab 情况下卸除fdisk [options] [devname]
parted
,例如: 查看你的磁盘的分区类型 sudo parted /dev/sda print
-l
: 列出指定分区信息,若仅有 fdisk -l
时,则全部 partition 均列出来dumpe2fs [options] [devname]
/dev/sda1
-h
: 仅列出 superblock 的数据,不会列出其他的区段内容-b
: 列出保留为坏轨的部分mkfs [-t fstype] [options] [devname]
-b
: 可以配置每个 block 的大小,目前支持 1024, 2048, 4096 bytes 三种-i
: 多少容量给予1个 inode-c
: 检查磁盘错误,仅下达一次 -c
时,会进行快速读取测试;如果下达两次 -c
-c
的话,会测试读写(read-write),会很慢fsck [-t fstype] [options] [devname]
-A
: 依据 /etc/fstab 的内容,将需要的装置扫瞄一次-a
or -y
: 自动修复检查到的有问题的扇区,不用一直按 y-f
: 强制细部检查-D
: 针对文件系统下的目录进行优化配置dd if=src of=dst bs=size count=num
if=
: 源,两个常用的源: /dev/zero
返回全0,/dev/random
返回随机数of=
: 目标bs=
: 每次复制的大小,单位有: c
1 byte; w
2 bytes; b
512 bytes; k
1024 bytes; M
1024k bytes; G
1024M bytescount=
: 复制的次数sudo fdisk -l # 查看挂载
sudo umount /dev/sdb1 # 必须先卸载该分区
sudo mkfs.vfat -F 32 /dev/sdb1 # -F 参数必须大写,参数有 12,16 和 32,分别对应FATxx
badblocks -b 4096 -sv /dev/sdb
ll /dev/disk/by-id/ # 查看对应的硬盘
sudo fsck -a /dev/disk/by-id/devname # fsck命令进行硬盘修复
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。