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"
的形式输出所有参数。
- 不在外面加
$0
Shell脚本名称$$
Shell脚本的进程号
shift命令 向左移动位置参数 $2
的内容分配给$1
, $3
的内容分配给$2
……
test 测试单个或多个条件
test expression
test "expression"
尽量将test的参数放在双引号中(允许变量替换)
test的另一种格式
[expression]
等同于test, 在[之后和]之前必须有空格
-a 逻辑”与”操作符
[ expression -a expression ]
-o 逻辑”或”操作符
[ expression -o expression ]
数值测试
-eq
equal 等于则为真-ne
not equal 不等于则为真-gt
greater than 大于则为真-ge
greater|equal 大于等于则为真-lt
less than 小于则为真-le
less|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 端口号
-t
tcp-u
udp
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) 简要介绍入门