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
2
3
4
5
6
7
8
9
10
if command
then
command
command
...
else
command
command
...
fi

case

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
case value in
pattern1) command
command
...
command;;
pattern2) command
command
...
command;;
...
pattern n) command
command
...
command;;
esac

for

1
2
3
4
5
6
7
for var in word_1 word_2 ... word_n
do
command
command
...
done

while

1
2
3
4
5
6
while command_t
do
command
command
...
done

until

1
2
3
4
5
6
until command_t
do
command
command
...
done

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) 简要介绍入门