Shell笔记¶
常用快捷键¶
查看环境变量¶
env | less -N
printenv | less -N
打印变量
echo $?
# mac or linux
echo $PATH
# windows
echo %PATH%
显示shell变量¶
set | less -N
打印变量
echo $?
echo $TERM
unset 复位变量
whereis 和 whatis¶
[root@VM-24-15-centos ~]# whatis cp
cp (1) - copy files and directories
[root@VM-24-15-centos ~]# whereis cp
cp: /usr/bin/cp /usr/share/man/man1/cp.1.gz
[root@VM-24-15-centos ~]#
who am i¶
mrwang@CodingdeMBP hugo-project % who am i
mrwang ttys000 Feb 3 12:43
mrwang@CodingdeMBP hugo-project % who are you
mrwang ttys000 Feb 3 12:44
mrwang@CodingdeMBP hugo-project % who goes there
mrwang ttys000 Feb 3 12:44
mrwang@CodingdeMBP hugo-project % who is god
mrwang ttys000 Feb 3 12:44
lsof¶
lsof(list open files)是一个列出当前系统打开文件的工具。
lsof 查看端口占用语法格式:
lsof -i:端口号
# lsof -i 需要 root 用户的权限来执行
# lsof -i:8000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nodejs 26993 root 10u IPv4 37999514 0t0 TCP *:8000 (LISTEN)
# 可以看到 8000 端口已经被轻 nodejs 服务占用。
更多 lsof 的命令如下:
lsof -i:8080:查看8080端口占用
lsof abc.txt:显示开启文件abc.txt的进程
lsof -c abc:显示abc进程现在打开的文件
lsof -c -p 1234:列出进程号为1234的进程所打开的文件
lsof -g gid:显示归属gid的进程情况
lsof +d /usr/local/:显示目录下被进程开启的文件
lsof +D /usr/local/:同上,但是会搜索目录下的目录,时间较长
lsof -d 4:显示使用fd为4的进程
lsof -i -U:显示所有打开的端口和UNIX domain文件
netstat¶
netstat -tunlp用于显示 tcp,udp 的端口和进程等相关情况。网络查询
# netstat 查看端口占用语法格式:
netstat -tunlp | grep 端口号
netstat -ntlp //查看当前所有tcp端口
netstat -ntulp | grep 80 //查看所有80端口使用情况
netstat -ntulp | grep 3306 //查看所有3306端口使用情况
-t (tcp) 仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化为数字
-l 仅列出在Listen(监听)的服务状态
-p 显示建立相关链接的程序名
# netstat -tunlp | grep 8000
tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN 26993/nodejs
kill¶
在查到端口占用的进程后,如果你要杀掉对应的进程可以使用 kill 命令:
kill -9 PID
# 如上实例,我们看到 8000 端口对应的 PID 为 26993,使用以下命令杀死进程:
kill -9 26993
tar¶
解压缩
tar -zxvf a.tar.gz
键入信号:erase, werase, kill¶
| 信号 | 键 | 作用 |
|---|---|---|
| erase | < Backspace > / < Delete > | 删除最后一个键入的字符 |
| werase | ^W | 删除最后一个键入的单词 |
| kill | ^X / ^U | 删除整行 |
^X 将光标移动到行的开头位置
stty命令¶
## 显示所有键盘映射当前设置
stty -a
## 屏蔽显示
stty -echo #禁止回显
stty echo #打开回显
## 忽略回车符
stty igncr # 开启
stty -igncr # 恢复
## 改变ctrl+D的方法:
stty eof "string" # 系统默认是ctrl+D来表示文件的结束,而通过这种方法,可以改变!
| 信号 | 键 | 作用 |
|---|---|---|
| erase | < Backspace > / < Delete > | 删除最后一个键入的字符 |
| werase | ^W | 删除最后一个键入的单词 |
| kill | ^X / ^U | 删除整行 |
| stop | ^S | 暂停屏幕显示 |
| start | ^Q | 重新启动屏幕显示 |
| eof | ^D | 指示已经没有数据 |
less 命令¶
less 与 more 类似,但使用 less 可以随意浏览文件,而 more 仅能向前移动,却不能向后移动,而且 less 在查看之前不会加载整个文件。
b 向上翻一页
空格键 向下翻一页
y 向上滚动一行
回车键 向下滚动一行
u 向上翻半页
d 向下翻半页
-i 忽略搜索时的大小写
-N 显示每行的行号
-o <文件名> 将less 输出的内容在指定文件中保存起来
-s 显示连续空行为一行
/字符串:向下搜索“字符串”的功能
?字符串:向上搜索“字符串”的功能
n:重复前一个搜索(与 / 或 ? 有关)
N:反向重复前一个搜索(与 / 或 ? 有关)
-x <数字> 将“tab”键显示为规定的数字空格
h 显示帮助界面
Q 退出less 命令
[pagedown]: 向下翻动一页
[pageup]: 向上翻动一页
- 案例一 分页查看ps进程信息
## -N 显示行号
ps -aux | less -N
- 案例二 查看多个文件
## 可以使用 n 查看下一个,使用 p 查看前一个。
less 1.log 2.log
scp 命令¶
scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的。可能会稍微影响一下速度。当你服务器硬盘变为只读 read only system时,用scp可以帮你把文件移出来。另外,scp还非常不占资源,不会提高多少系统负荷,在这一点上,rsync就远远不及它了。虽然 rsync比scp会快一点,但当小文件众多的情况下,rsync会导致硬盘I/O非常高,而scp基本不影响系统正常使用。
使用scp需要远程用户密码;如果配置远程ssh的私钥则不用密码,自动使用私钥登陆
命令格式
scp [参数] [原路径] [目标路径]
[目标路径]: user@server-ip:server-path
常用命令参数
-C - 这会在复制过程中压缩文件或目录。
-P - 如果默认 SSH 端口不是 22,则使用此选项指定 SSH 端口。
-r - 此选项递归复制目录及其内容。
-p - 保留文件的访问和修改时间。
- 复制文件到远程服务器
scp logs.tar.gz root@192.168.43.137:/root
- 复制远程服务器文件到本地
scp root@192.168.43.137:/root/logs.tar.gz ./
- 复制文件夹到远程服务器
scp -rC syslog root@192.168.43.137:/root
- 复制远程服务器文件夹到本地
scp -rC root@192.168.43.137:/root syslog
参考:
https://www.cnblogs.com/peida/archive/2013/03/15/2960802.html
https://www.linuxprobe.com/scp-cmd-usage.html
rsync 命令¶
Rsync(remote sync ; remote synchronous)是UNIX 及类UNIX 平台下一款神奇的数据镜像备份软件,它不像FTP 或其他文件传输服务那样需要进行全备份,Rsync 可以根据数据的变化进行差异备份,从而减少数据流量,提高工作效率。你可以使用它进行本地数据或远程数据的复制,Rsync 可以使用SSH 安全隧道进行加密数据传输。Rsync 服务器端定义源数据,Rsync 客户端仅在源数据发生改变后才会从服务器上实际复制数据至本地,如果源数据在服务器端被删除,则客户端数据也会被删除,以确保主机之间的数据是同步的。Rsync 使用TCP
873端口。 使用rsync需要远程用户密码;如果配置远程ssh的私钥则不用密码,自动使用私钥登陆 配置文件:/etc/rsyncd.conf。windows安装 rsync https://www.itefix.net/cwrsync
https://www.cnblogs.com/zhangweiyi/p/10571273.html
https://blog.csdn.net/zetion_3/article/details/103575905
常用参数:
-a 包含-rtplgoD
-r 同步目录时要加上,类似cp时的-r选项
-v 同步时显示一些信息,让我们知道同步的过程
-l 保留软连接
-L 加上该选项后,同步软链接时会把源文件给同步
-p 保持文件的权限属性
-o 保持文件的属主
-g 保持文件的属组
-D 保持设备文件信息
-t 保持文件的时间属性
--delete 删除DEST中SRC没有的文件
--exclude 过滤指定文件,如--exclude “logs”会把文件名包含logs的文件或者目录过滤掉,不同步
-P 显示同步过程,比如速率,比-v更加详细
-u 加上该选项后,如果DEST中的文件比SRC新,则不同步
-z 传输时压缩
sz,rz 命令¶
使用xshell来操作服务非常方便,传文件也比较方便。 就是使用rz,sz
首先,服务器要安装了rz,sz
yum install lrzsz
当然你的本地windows主机也通过ssh连接了linux服务器 运行rz,会将windows的文件传到linux服务器 运行sz filename,会将文件下载到windows本地
同步文件夹¶
- 上传文件夹及同步
## -r 递归处理文件夹
## 文件夹最后必须带斜杠(/),不带则远程会创建文件夹
## 第一次同步后,第二次及后面的同步都是增量同步,存在的文件且相同的不会传输
rsync -r ~/pub/ 101.43.160.247:~/public/
## --delete 本地如果删除文件或文件夹,同步后会删除远程的文件或文件夹(exclude 忽略的文件或文件夹除外)
## --exclude 本地忽略同步的文件或文件夹,例如项目中.git文件夹不需要同步到远程
rsync -rtvpz --delete --exclude .git ~/pub/ root@101.43.160.247:~/public/
rsync -rt --delete --exclude .git ~/pub/ 101.43.160.247:~/public/
- 下载文件夹及同步
## -r 递归处理文件夹
## 文件夹最后必须带斜杠(/),不带则远程会创建文件夹
## 第一次同步后,第二次及后面的同步都是增量同步,存在的文件且相同的不会传输
rsync -r 101.43.160.247:~/public/ ~/pub/
## --delete 本地如果删除文件或文件夹,同步后会删除远程的文件或文件夹(exclude 忽略的文件或文件夹除外)
## --exclude 本地忽略同步的文件或文件夹,例如项目中.git文件夹不需要同步到远程
rsync -rtvpz --delete --exclude .git 101.43.160.247:~/public/ ~/pub/
同步文件¶
- 上传文件及同步
rsync ~/pub/a.txt 101.43.160.247:~/public/f.txt
- 下载文件及同步
rsync 101.43.160.247:~/public/f.txt ~/pub/a.txt
参考:
https://www.jianshu.com/p/5a799b36c7e1
https://blog.csdn.net/allway2/article/details/103073243
Rsync同步时删除多余文件
rsync --exclude 参数
windows 上rsync客户端使用方法
md5sum 使用¶
centos 默认安装了
md5sum命令
- 计算二进制文件的md5:
# -b, --binary Read files in binary mode
# -t, --text Read files in ASCII mode
md5sum filename
- 计算字符串md5值:
[root@xyz.com ~]$ echo -n 'hello world!' | md5sum
fc3ff98e8c6a0d3087d515c0473f8677 -
注:一定要加上'-n'参数,代表去掉控制字符。
错误命令示例1:
[root@xyz.com ~]$ echo 'hello world!' | md5sum
c897d1410af8f2c74fba11b1db511e9e -
错误操作2:将文本hello world!写在文本文件中进行保存test文件,然后对文件进行md5sum。
mrwang@CodingdeMBP Sites % echo 'hello world!' | md5sum
c897d1410af8f2c74fba11b1db511e9e -
mrwang@CodingdeMBP Sites % cat test | md5sum
c897d1410af8f2c74fba11b1db511e9e -
mrwang@CodingdeMBP Sites % md5sum test
c897d1410af8f2c74fba11b1db511e9e test
mrwang@CodingdeMBP Sites %
此错误操作与错误1得到的结果一样,都是因为文本中会自动带上一些控制字符,从而导致最终计算出来的md5值不是纯粹字符串的md5值。
用vi打开test文件 使用vi 命令":set list",显示如下:
hello world!$
多了控制字符。
- 批量文件计算md5:
#!/bin/sh
#获取文件夹下所有文件
folder="./"
softfiles=$(ls $folder)
cd ${folder}
for sfile in ${softfiles}
do
md5sum $sfile >> ../md5sum.txt
# md5sum $sfile
done
Mac 使用 md5sum:
Mac没有自带md5sum, 需要安装md5sum。
使用brew安装brew install md5sha1sum参考:
https://www.cnblogs.com/xd502djj/p/7055228.html http://www.blogjava.net/anchor110/articles/433319.html
find 命令¶
查找文件或者文件夹test
# 在当前目录查找文件或文件夹 test
find test
# 在根目录查找文件或文件夹 test
find / -name test
# 在根目录查找文件或文件夹 以test开头的
find / -name test*
find / -name ‘test*’
# 在 home 目录查找文件或文件夹 包含 test 的
find /home -name *test*
find /home -name ‘*test*’
查找文件test
# 在当前目录查找文件 test
find test -type f
# 在根目录查找文件 test
find / -name test -type -f
查找文件夹test
# 在当前目录查找文件夹 test
find test -type f
# 在根目录查找文件夹 test
find / -name test -type -f
参考:
https://www.runoob.com/linux/linux-comm-find.html
https://blog.csdn.net/l_liangkk/article/details/81294260
tail 命令¶
Linux中用于查看文件尾部的内容,与head相对应。
常用来查看日志文件,通过 tail -f 实时查看文件最新内容。
尤其是对于日志文件较大的时候,通过tail指定输出的行数来查看日志。
// 输出最后10行的内容
tail test.log
// 输出最后10行的内容,同时监视文件的变化,一旦变化就显示出来
tail -f test.log
// 输出最后n行的内容,同时监视文件的变化,一旦变化就显示出来
tail -nf test.log
// 输出文件最后10行的内容
tail -n 10 filename
// 除第9行不显示外,显示第10行到末尾行
tail -n -10 filename
// 从第20行至末尾
tail +20 test.log
// 显示最后10个字符
tail -c 10 test.log
// 实时日志查看与grep过滤关键字
// -A 除显示符合t匹配内容的那一行之外,并显示该行之后的内容
// -B 除显示符合匹配内容的那一行之外,并显示该行之前的内容
// -C 除显示符合匹配内容的那一列之外,并显示该列前后的内容
tail -f test.log | grep 'test' -C 5
tail -f test.log | grep 'test' -5
curl 命令¶
https://www.cnblogs.com/duhuo/p/5695256.html
https://www.ruanyifeng.com/blog/2019/09/curl-reference.html
常用命令
读取文件每一行¶
- 使用for循环
# 换行符必须是unix的\n,不能是windows的\r\n,mac是\r结尾
# `cat img.txt | tr "\r\n" "\n" | tr "\r" "\n"`
for line in `cat img.txt | tr '\r\n' '\n'`
do
echo $line
cp -f "/d/Sites/hugo-project/content/imgs/${line}" "./imgs/${line}"
done
- 使用for循环
# 换行符必须是unix的\n,不能是windows的\r\n,mac是\r结尾
# $(cat img.txt | tr "\r\n" "\n" | tr "\r" "\n")
for line in $(cat img.txt| tr '\r\n' '\n')
do
echo $line
cp -f "/d/Sites/hugo-project/content/imgs/${line}" "./imgs/${line}"
done
- 使用while循环
# 换行符必须是unix的\n,不能是windows的\r\n,mac是\r结尾
while read -r line
do
echo $line
cp -f "/d/Sites/hugo-project/content/imgs/${line}" "./imgs/${line}"
done < filename
ln 软连接¶
第一,ln命令会保持每一处链接文件的同步性,也就是说,不论你改动了哪一处,其它的文件都会发生相同的变化;
第二,ln的链接分软链接和硬链接两种,软链接就是ln–s ,它只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间,硬链接ln,没有参数-s, 它会在你选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件都保持同步变化。
# 源文件 和 链接名称 尽量使用绝对路径
ln -s <源文件> <链接名称>
ln-s abc cde #建立abc 的软连接
ln abc cde #建立abc的硬连接
-f: 链结时先将与dist同档名的档案删除
-d:允许系统管理者硬链结自己的目录
-i: 在删除与dist同档名的档案时先进行询问
-n:在进行软连结时,将dist视为一般的档案
-s:进行软链结(symboliclink)
-v:在连结之前显示其档名
-b:将在链结时会被覆写或删除的档案进行备份
-SSUFFIX :将备份的档案都加上 SUFFIX的字尾
-VMETHOD :指定备份的方式
--help:显示辅助说明
--version:显示版本
android adb命令¶
这里总结了一些常用的PC版模拟器连接方法!其他的自行搜索!
MuMu模拟器:adb connect 127.0.0.1:7555
夜神模拟器:adb connect 127.0.0.1:62001
雷电模拟器:adb connect 127.0.0.1:5555
逍遥安卓模拟器:adb connect 127.0.0.1:21503
天天模拟器:adb connect 127.0.0.1:6555
海马玩模拟器:adb connect 127.0.0.1:53001https://www.52pojie.cn/thread-1872463-1-1.html
- 查看设备列表
adb devicesPS E:\Soft> adb devices List of devices attached f8d600b1 device emulator-5554 device - 安装apk
指定一个设备安装,apk要用绝对路径(可以直接拽到命令行中)
PS E:\Soft> adb -s f8d600b1 install E:\Soft\debug.apk
Performing Streamed Install
Success
如果devices只有一个设备,apk要用绝对路径(可以直接拽到命令行中)
PS E:\Soft> adb install E:\Soft\debug.apk
Performing Streamed Install
Success
强制安装(覆盖安装时使用)
adb install -r E:\Soft\debug.apk
常见问题¶
情况一:adb devices命令启动了adb服务器,但是设备列表未显示。
解决方法:
第一步:先使用adb kill-server命令停止 adb 服务器,再切换目录到android_sdk/tools 目录下,因为emulator 命令位于 android_sdk/tools 目录下。
第二步:停止 adb 服务器后,输入命令emulator -list-avds获取 AVD 名称列表,再执行命令emulator -avd AVD名称 -port 奇数端口号,最后执行adb devices -l查询设备即可。
情况二:在下面的命令序列中,adb devices 显示了设备列表,因为先启动了 adb 服务器。
解决方法:
第一步:先停止adb服务器,再切换目录到android_sdk/tools 目录下使用命令emulator -avd AVD名称 -port 奇数端口号。
第二步:在使用adb devices -l命令查询设备之前,使用adb start-server命令重新启动adb服务器。
adb连接夜神多开器的多个模拟器¶
但是当我们打开多个夜神的其他多开设备时候, 直接使用以下命令链接,会失败!
adb connect 127.0.0.1:62001
那么这个时候我们需要先关闭其他模拟器,只打开要链接的那个多开器,然后去cmd窗口输入
tasklist

找到对应的夜神pid,然后输入
netstat -ano | findstr 5508
找到端口为 62***的,然后去adb链接
连接成功!
可以使用以下命令,查看一下!
adb devices
