Linux额外
cut 提取/切出各种字段
cut -c{chars} file 指定从file的每行内提取哪些字符(依据位置)
-c5每行第5个-c1,13,50第1,13,50-c20-50第20~50-c5-5到行尾
-d指定字段分隔符, 默认使用制表符为字段分隔符
-f指定待提取的字段
$cut -d{dchar} -f{fields} file
sed 在管道或命令序列中编辑数据
sed command file
$sed 's/Unix/UNIX/' intro 将intro文件每行的第一个Unix换成UNIX
$sed 's/Unix/UNIX/g'每一行的每一个(全局选项)
-n选项
-n默认不打印任何行
-p打印出符合指定范围或模式的所有行
$sed -n '1,2p' intro只打印前两行
$sed -n '/UNIX/p' intro只打印出包含UNIX的行
删除行
用d命令, 指定行号或者行范围,从输入中删除指定的行
$sed '1,2d' intro 删除行1和行2
$sed '/UNIX/d' intro 删除所有包含UNIX的行
tr 转换标准输入中的字符
tr {from-chars} {to-chars}
tr从标准输入中获得输入,转换结果被写入标准输出,不会改动原始文件
对某个范围的字符进行转换
$tr '[a-z]' '[A-Z]' < intro将intro中所有的小写字母转换成对应的大写字母
$tr '[a-zA-Z]' '[A-Za-z]' < intro 大小写互换
grep
-v选项 排除
$grep -v 'UNIX' intro 打印不包含UNIX的行
-l选项 输出匹配指定模式的行所在的文件
sort
-u消除输出中重复的行
-r逆序排列
-o 输出重定向到文件(默认为写入标准输出)
$sort {names} -o {sorted_names} 将排序后的names写入到文件sorted_names中
跳过某些字段
-k{i}n 对每行的第i个字段进行算术排序
$sort -k2n data 从第二个字段开始排序
-t选项指定分隔符
$sort -k3n -t: /etc/passwd对第3个以冒号分隔的字段进行算术排序
引用
单引号告诉Shell忽略引用的所有特殊字符
双引号忽略引用的大部分特殊字符,除了美元$ 反引号`反斜线\
$()是反引号` `的新版替代版/升级版
传递参数
- 变量
$#命令行中输入的参数个数 - 变量
$*传给程序的所有参数,Shell用$1,$2...来替换$* - 变量
$?最后一条命令的退出状态,成功则是0 - 变量
$@传给程序的所有参数,若用"$@",那么传入的值则是"$1","$2",...- 不在外面加
" "时,$@和$*效果一样,都是以列表形式输出所有参数; - 加了
" "之后,"$*"会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@"会将各个参数分开,以"$1" "$2" … "$n"的形式输出所有参数。
- 不在外面加
$0Shell脚本名称$$Shell脚本的进程号
shift命令 向左移动位置参数 $2的内容分配给$1, $3的内容分配给$2……
test 测试单个或多个条件
test expressiontest "expression"
尽量将test的参数放在双引号中(允许变量替换)
test的另一种格式
[expression]
等同于test, 在[之后和]之前必须有空格
-a 逻辑”与”操作符
[ expression -a expression ]
-o 逻辑”或”操作符
[ expression -o expression ]
数值测试
-eqequal 等于则为真-nenot equal 不等于则为真-gtgreater than 大于则为真-gegreater|equal 大于等于则为真-ltless than 小于则为真-leless|equal 小于等于则为真
字符串测试
=等于则为真!=不相等则为真-z 字符串字符串的长度为零则为真-n 字符串字符串的长度不为零则为真
文件测试
-e 文件名如果文件存在则为真-r 文件名如果文件存在且可读则为真-w 文件名如果文件存在且可写则为真-x 文件名如果文件存在且可执行则为真-s 文件名如果文件存在且至少有一个字符则为真-d 文件名如果文件存在且为目录则为真-f 文件名如果文件存在且为普通文件则为真-c 文件名如果文件存在且为字符型特殊文件则为真-b 文件名如果文件存在且为块特殊文件则为真
if
1 | if command |
case
1 | case value in |
for
1 | for var in word_1 word_2 ... word_n |
while
1 | while command_t |
until
1 | until command_t |
read
read variables
从标准输入中读取一行,将第n个单词分配给variables中的第n个变量,若有多的,那么多出的单词全部分配给最后一个变量
printf
printf "format" arg1 arg2 ...
和c/c++的差不多
环境
局部变量
运行程序是启动不含任何局部变量新Shell/子Shell来执行该程序,会有新的局部变量域
导出变量 export
export variables
variables是要导出的变量名列表.export [-fnp][变量名称]=[变量设置值]-p 列出所有的shell赋予程序的环境变量。
- 已导出变量的值会传到export命令之后的所有子Shell中,但子Shell改变后的导出变量值不会影响登录Shell的该变量值,相当于只是传副本
- 变量可以在赋值前后随时导出,但是只取其导出时的值,不再理会之后做出的改变
- export的效果仅限于该次登陆操作。
export -p
得到一个列表,其中包含了Shell所导出的变量及其值
.profile文件
/etc/profile 全局$HOME/.profile 用户
包含PATH,及登录时自动执行的命令
查看端口占用情况
- #
lsof -i:端口号 - $
netstat -tunlp | grep 端口号
-ttcp-uudp
lsof 查看当前系统文件的工具
lsof(list open files)
-p<进程号>列出指定进程号所打开的文件
cat /proc/version 查看Linux内核版本信息
lsb_release -a 查看linux版本信息
tar.gz
tar只是打包工具,重要的是可以保留链接和权限,而zip、7z不保留,gzip才是压缩
打包和压缩。
打包是指将一大堆文件或目录变成一个总的文件;
压缩则是将一个大的文件通过一些压缩算法变成一个小文件。
SSH
将默认Shell改为ZSH
sudo chsh -s $(which zsh)
远程连接
ssh [user用户名]@[host地址] -p[端口]
密钥生成和拷贝
ssh-keygen 生成公钥
-t “type” 加密算法类型-b “bits” 密钥的比特数,即密钥长度
ssh-copy-id [user用户名]@[host地址] 拷贝公钥
scp 加密传送文件
远程服务器传到本地主机
scp -P [端口] [user用户名]@[host地址]:[文件路径] [本地存放目录]
-v 显示详细输出
本地主机传到本地主机远程服务器
与前面相反,scp [参数] 本地路径 远程路径
rsync 本地主机和远程主机目录之间的同步
移动光标
Ctrl + A/Home光标移动到行首
Ctrl + E/End光标移动到行尾 Ctrl + 左方向键/Alt+B/Esc + B(不能同时按)光标移动向前一个单词 Ctrl + 右方向键/Alt+C/Esc + F(不能同时按)光标移动向后一个单词
快捷键冲突
在Mac上会有快捷键冲突,Ctrl+方向键默认为切换桌面;Alt + 字符键默认为输出其它字符
解决办法:
- 运行
cat,输入某个快捷键组合,会显示所发送的代码;以zsh为例,创建~/.zshrc,在里面添加bindkey "快捷键组合" forward-word/backward-word/其它功能 - 另一种办法:直接在iTerm2的
Preferences->Profiles->Key里改⌥+← Send Hex Codes: 0x1b 0x62光标向左一个单词⌥+→ Send Hex Codes: 0x1b 0x66光标向右一个单词 - 第二种修改对iTerm2下所有Shell都生效,但换回系统终端/VScode终端/Termius没用;第一种修改特定Shell的配置文件,仅对所修改的Shell有用,但所有终端应用都有效;各有利弊
- ZLE (The Z-Shell Line Editor) 简要介绍入门