Cwww3's Blog

Record what you think

0%

Linux常用命令

Linux常用命令

  • find
1
2
3
4
5
6
7
# 只在当前目录下搜索 符合条件的文件
find . -maxdepth 1 -name 表达式
-type f/d 指定类型
-perm xxx 指定权限
-a 与
-o 或
! -not 非
  • xargs
1
2
3
4
5
# xargs命令的作用,是将标准输入转为命令行参数。
# echo 不接受标准输入作为参数 只能直接在命令行输入参数 无法用管道命令传递参数 不会有输出
echo "hello world" | echo
# 输出 hello world
echo "hello world" | xargs echo
  • grep
1
2
# 当前目录下查找内容
grep -r "要查找的内容" .
  • tee
1
2
3
4
5
6
# 不退出vim保存没权限的文件
:w !sudo tee %
# w 保存文件内容
# !sudo 使用sudo权限
# tee 将w输出的内容重定向到%
# % 当前文件
  • sed
1
2
3
4
5
6
# 替换文件内容
sed -i suffix "s/原字符串/替换字符串/g" filename
# suffix 对修改文件进行备份,名字为原名加后缀 (osx系统必须指定,可以输入""表示不备份)
# s 表示替换
# g 表示全部替换
# -i 修改文件 -e 将修改后的内容输出到标准输出,不修改文件
  • 重定向
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
# Linux重定向是指修改原来默认的一些东西,对原来系统命令的默认执行方式进行改变
# Linux默认输入是键盘,输出是显示器。
# STDIN 0 键盘输入 STDOUT 1 输出信息到提示符窗口 STDERR 2 输出错误信息到提示符窗口
# 默认的 < 重定向输入操作符是 0,而默认的 > 重定向输出操作符是 1。键入 < 或 > 操作符之后,必须指定数据的读写位置,可以是文件名或其他现有的句柄。
# 要指定重定向到现有句柄,请使用与 & 字符,后面接要重定向的句柄号。如:2>&1

> #将命令输出写入文件或设备,而不是命令提示符或句柄

< #从文件而不是从键盘或句柄读入命令输入

>> #将命令输出添加到文件末尾而不删除文件中已有的信息

>& #将一个句柄的输出写入到另一个句柄的输入中

<& #从一个句柄读取输入并将其写入到另一个句柄输出中

| #从一个命令中读取输出并将其写入另一个命令的输入中;也称为管道操作符

# 例:
mysh > mylog.txt 2>&1
# > mylog.txt意思是将标准输出重定向到mylog.txt,等价于mysh 1> mylog.txt;
# 2 >& 1 意思是将错误输出重定向到句柄1标准输出;综合起来就是mysh命令执行过程中产生的标准输出和错误输出都会被重定向到mylog.txt中;

# 某些时候我们可能并不希望记录什么标准输出或者是错误输出,那可以用
mysh >/dev/null 2>/dev/null;
  • 进程替代(Process substitution)
1
2
3
4
5
6
7
8
9
进程替代是进程间通信的一种方式。在 Linux 上使用进程替代的时候,系统会创建一个临时的文件描述符,然后将用以替代的进程的输出和这个文件描述符关联起来,这个可以通过以下命令来验证:
执行 echo <(date)
输出 /dev/fd/11
fd就是文件描述父的缩写,但你去/dev/fd/下面找这个文件描述符,却会发现找不到,那是因为这个文件描述符是临时的,在传给"echo"命令后就被释放了。
此外,进程替代并不能和文件完全等价,这一点要切记。进程替代所建立的"对象",是不能进行写入和随机读取操作的。

例子
需求: 运行mysh并指定一个配置文件(配置文件没有权限直接修改,但是需要在配置文件中添加foo=bar)
mysh -config=<(cat /path/config <(print "foo=bar"))
  • kill
1
2
3
4
5
6
kill -l #查看信号
kill PID #默认 -15 TERM
kill -9 PID # 强制杀死程序 KILL

# 一般情况下,优先使用SIGTERM信号。这是因为当程序收到了SIGTERM信号之后,会做一些程序的清理操作,或者说是优雅的关闭。
# 如果传入kill -9 也就是SIGKILL,那么应用程序将无法捕捉这个信号,从而导致程序强制被关闭,有可能会照成一些异常情况,比如数据还没有保存,数据传输还没有结束等等。
  • lsof
1
2
lsof -i :port # 查看端口占用
lsof -p 5656 # 查看进程ID
  • if
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
if [ command ]; then
符合该条件执行的语句
fi

if [ command ];then
符合该条件执行的语句
elif [ command ];then
符合该条件执行的语句
else
符合该条件执行的语句
fi

# 常用参数:
[ -a FILE ] 如果 FILE 存在则为真。
[ -d FILE ] 如果 FILE 存在且是一个目录则返回为真。
[ -e FILE ] 如果 指定的文件或目录存在时返回为真。
[ -f FILE ] 如果 FILE 存在且是一个普通文件则返回为真。
[ -r FILE ] 如果 FILE 存在且是可读的则返回为真。
[ -w FILE ] 如果 FILE 存在且是可写的则返回为真。(一个目录为了它的内容被访问必然是可执行的)
[ -x FILE ] 如果 FILE 存在且是可执行的则返回为真。

[ -z STRING ] 如果STRING的长度为零则返回为真,即空是真
[ -n STRING ] 如果STRING的长度非零则返回为真,即非空是真
[ STRING1 ]  如果字符串不为空则返回为真,与-n类似
[ STRING1 == STRING2 ] 如果两个字符串相同则返回为真
[ STRING1 != STRING2 ] 如果字符串不相同则返回为真
[ STRING1 < STRING2 ] 如果 “STRING1”字典排序在“STRING2”前面则返回为真。
[ STRING1 > STRING2 ] 如果 “STRING1”字典排序在“STRING2”后面则返回为真。

[ INT1 -eq INT2 ] INT1和INT2两数相等返回为真 ,=
[ INT1 -ne INT2 ] INT1和INT2两数不等返回为真 ,<>
[ INT1 -gt INT2 ] INT1大于INT2返回为真 ,>
[ INT1 -ge INT2 ] INT1大于等于INT2返回为真,>=
[ INT1 -lt INT2 ] INT1小于INT2返回为真 ,<
[ INT1 -le INT2 ] INT1小于等于INT2返回为真,<=

[ ! EXPR ] 逻辑非,如果 EXPR 是false则返回为真。
[ EXPR1 -a EXPR2 ] 逻辑与,如果 EXPR1 and EXPR2 全真则返回为真。
[ EXPR1 -o EXPR2 ] 逻辑或,如果 EXPR1 或者 EXPR2 为真则返回为真。
[ ] || [ ] 用OR来合并两个条件
[ ] && [ ] 用AND来合并两个条件

IF高级特性:
双圆括号(( )):表示数学表达式
双方括号[[ ]]:表示高级字符串处理函数

[ $a != 1 || $b = 2 ]是不允许的 要用[ $a != 1 ] || [ $b = 2 ]
而双括号就可以解决这个问题 [[ $a != 1 || $b = 2 ]]

[ "$a" -lt "$b" ],也可以改成双括号的形式(("$a" < "$b"))
Donate comment here.