本文记录linux相关的知识,如软件安装、shell语言、awk语言、系统优化等。
文章目录
-
- [1. 软件安装](#1. 软件安装)
-
- [1.1. gcc、make等开发工具](#1.1. gcc、make等开发工具)
- [1.2. apt查找](#1.2. apt查找)
- [2. 其他](#2. 其他)
-
- [2.1. git保存密码](#2.1. git保存密码)
- [2.2. 计算器 bc](#2.2. 计算器 bc)
- [3. awk](#3. awk)
-
- [3.1. 比较表达式](#3.1. 比较表达式)
- [3.2. 自动变量](#3.2. 自动变量)
- [3.3. 内置函数](#3.3. 内置函数)
- [4. bash](#4. bash)
-
- [4.1. 关联数组(即字典)](#4.1. 关联数组(即字典))
- [4.2. 判断命令与逻辑表达式](#4.2. 判断命令与逻辑表达式)
- [4.3. 命令传参](#4.3. 命令传参)
- [4.4 <](#4.4 <)
- [4.5. while](#4.5. while)
- [4.6. exec](#4.6. exec)
- [4.7. for语句](#4.7. for语句)
- [4.8. seq](#4.8. seq)
- [4.9. bash -c](#4.9. bash -c)
- [5. ps](#5. ps)
- [6. wget](#6. wget)
-
- [6.1. ftp下载](#6.1. ftp下载)
- [7. curl](#7. curl)
- [8. unzip](#8. unzip)
1. 软件安装
1.1. gcc、make等开发工具
bash
sudo apt -y install build-essential gdb
1.2. apt查找
bash
sudo apt search --names-only ^git$
2. 其他
2.1. git保存密码
bash
sudo apt install libglib2.0-dev libsecret-1-dev -y
sudo make -C /usr/share/doc/git/contrib/credential/libsecret
git config --global credential.helper /usr/share/doc/git/contrib/credential/libsecret/git-credential-libsecret
git config --global user.email xxx
git push
# 输入一次密码后就会保存下来
2.2. 计算器 bc
bash
echo '11.1/10' | bc -l
-l 会返回小数 否则返回整数
3. awk
3.1. 比较表达式
xx ~ /reg/ 正则匹配表达式
3.2. 自动变量
$0表示整行
NR 表示行数,从1开始
3.3. 内置函数
match(reg,str) 返回匹配到的位置 长度为RLENGTH
substr(str,idx,len)
length(str)
sub(reg,replace,target) 直接在target上替换不会返回替换后的字符串,只替换1个
gsub 参数同上,语义是替换所有
asorti(arr,sorted) 排序后的键存放在sorted中
4. bash
4.1. 关联数组(即字典)
declare -A map
-A 表示声明关联数组
mapname=xiaoming
遍历key ${!map@} 获取值 KaTeX parse error: Expected '}', got 'EOF' at end of input: {mapkey}
遍历值 ${map@}
4.2. 判断命令与逻辑表达式
[ xx ] && [ ! xx ]
-n 非空字符串
-z 空字符串
-e 文件或目录存在
-f 文件存在
-d 目录存在
-eq ne lt gt le ge 数字比较 数字用字符串表示
注意:
[ 是一个命令 与test完全一样 后面必须有空格
[[ xx ]] 是 [ xx ]的增强支持
\[ xx \&\& ! xx \]
\[ xx == xx ] 支持通配符*
\[ xx =\~ \^\[0-9+$ ]] 正则匹配
(( xx )) 算术运算 返回0为假
4.3. 命令传参
echo aa | awk "{print $0}"
错误,使用双引号时bash会先解析字符串,替换$0为bash环境变量,在传给awk,于是awk输出错误。
使用单引号时不会替换bash环境变量。
ssh -l root ip ' echo aa | awk \'{print $0}\' '
错误,单引号中无法转义,\只是单纯的字符,因此上面会被解释为:
' echo aa | awk \' 这是一个整体
{print 是一个独立的部分与前面的拼在一起
$0 会被替换为环境变量的值
}\' 表示两个拼在一起的字符
最后一个引号没有关闭。
正确的可以写作:
ssh -l root ip echo aa \| awk \'{print \$0}\'
其中| ' $需要转义,否则会被bash当做关键字处理。
4.4 <
将文件内容作为标准输入
4.5. while
bash的while语句:while condition命令; do command;done
不停执行condition命令和command,直到condition命令返回失败时退出循环,也可以break退出。
while read line; do echo $line;done < file
将file的内容作为当前bash的标准输入,在while下read一次读取一行,读取完一行后文件偏移一行,接着从偏移位置读取下一行,直到文件结尾返回失败,退出循环。循环结束后bash的标准输入恢复成原来的。
4.6. exec
直接替换当前bash进程的程序镜像而不是创建子进程。
exec 3>file 打开文件写入,绑定到文件描述符3
exec 3<&0 将当前bash进程的标准输入复制到到文件描述符表中的索引3处
exec <file 将文件内容重定向到标准输入,无法接收键盘输入了,脚本里面记得要手动恢复,交互式直接嘎了。
exec >file 将标准输出重定向到文件
4.7. for语句
for 名称 [in 词语 ... ] ; do 命令; done
遍历列表中的元素,示例:
for i in seq 0 10; do echo $i; done
4.8. seq
seq OPTION... LAST
seq OPTION... FIRST LAST
seq OPTION... FIRST INCREMENT LAST
示例:
seq 0 2 10
输出0到10,步长是2,就是 0 2 4 6 8 10
4.9. bash -c
指定-c时,后面第一个非option参数作命令,命令后面还有参数的话,分别作0 1 ... 传给命令
示例:
bash -c 'echo $0 $1 $2' aa bb cc
上面会打印aa bb cc
bash -c echo aa bb cc
表示执行命令echo,aa bb cc作0 1 $2,由于命令只是一个echo,所以什么也不打印
5. ps
ps -ef
输出:
UID PID PPID C STIME TTY TIME CMD
checx 25938 25767 0 23:09 pts/0 00:00:00 ps -ef
-e 输出所有进程
UID 其实显示的是EUID,即实际用来作权限检查的用户,通常 EUID = UID(登录用户),但是当可执行文件带有 set-user-ID (SUID) 位时,EUID 变成文件属主 ID,进程就临时拿到属主权限。如:
-rw++s++r-xr-x 1 root root /usr/bin/passwd
普通用户运行passwd命令,EUID是root,这是由于该进程需要root权限来写/etc/shadow。
C 进程启动以来的平均cpu使用率,cpu使用时间/进程运行时间*100%
STIME 启动时间
TIME 累计占用CPU时间
TTY 终端,?表示没有终端(后台进程)
CMD 启动命令 + 参数(会被屏幕宽度截断,想看完整加 ww)
ps -eF
相较于-f增加了:
SZ 分配的虚拟内存页数,s*页大小=vsz
RSS resident set size, 实际驻留在物理内存中的大小(单位:KB),包括共享库。
PSR 进程最近使用的cpu编号
ps -efL
增加了:
LWP 线程ID
NLWP 线程数量
ps -eo pid,ppid,cmd,%mem,rss,vsz,args -p <pid>
rss: resident set size, 实际驻留在物理内存中的大小(单位:KB),包括共享库。
vsz: visual size, 虚拟内存使用(单位:KB),进程地址空间中已分配的虚拟内存。
args: 启动命令和参数
6. wget
6.1. ftp下载
wget -m -nH --ftp-user=xxx --ftp-password=xxx ftp://xxxxx
-m 递归
-nH 不创建ftp服务器目录
7. curl
bash
curl -XPOST -H 'Content-Type: application/json' -d @<file> <url>
-X 请求方法,如GET,POST,DELETE
-H 请求头,可以有多个-H参数
-d 请求体,可以是字符串,也可以使用文件,使用文件时,文件名前要加@
8. unzip
bash
unzip -O GBK -d <dir> file.zip
-O 指定字符编码,解压后文件名中文乱码时可以指定GBK试一试
-d 解压目录,目录不存在时会自动创建