437 views
---
title: 2021-04-13
date: 2021-04-13 15:40
---
# Linux
## File
root
home
boot
etc
usr
bin->usr/bin
lib->usr/lib
tmp
dev
## Command
### cat
cat -n 编号
cat -b 空白行不编号
cat -s 压缩连续空行
### ls
ls -a 全部信息
ls -l 长信息
ls -F 附加文件类型
#### 文件类型
\* 可执行的普通文件
/ 表示目录
@ 符号链接
| FIFOs
= 套接字
- - - - -
普通文件 -
目录文件 p
设备文件 b/c
链接文件 l
管道文件 p
### more
more -d 提示
more -f 计算实际显示行数
more -s 合并显示空行
more +/pattern 搜索字串并在此之后开始显示
more -num 一行显示的行数
more +num 从 num 行开始显示
- - - - -
space/n 下一屏
b 上一屏
enter 下一行
/pattern 搜索
### less
less -a 最后一页
less -m 百分比
less -M 百分比 行号 总行数
less -N 行号
less -p pattern 搜索 pattern
less -s 合并显示空行
### head
head -num
### tail
tail -num
### cp
cp -a = cp -drp
cp -d 保留文件链接 如文件下有软连接需要含此项
cp -f 强制不提醒
cp -i 交互提醒
cp -p 更新修改日期与访问权
cp -r 递归复制文件树
cp -v 可视化操作
cp -l 不复制而只产生硬链接
cp -s 不复制而只产生软连接
### mv
mv -/d d
mv -i 交互提醒
mv -f 强制不提醒
### rm
rm -r 递归删除文件夹
rm -f 强制不提醒
rm -i 交互提醒
若有文件以-开头 需要 rm -- -file
### sort
sort -m 合并排序
sort -n 以数值大小比较
sort -d 字典序(默认)
sort -r 逆序
sort -t char 选定分隔字符
sort -u 保留唯一键值
sort -k 选定排序键值
sort -k1,2
sort -k1.1,2
sort -o 输出到文件
sort -nrk1,1 -udk2,2 -nk3,3 a.txt
### diff
diff -b 忽略空格
diff -c 上下文格式显示
diff -C num 显示 num 行上下文
- - - - -
<为 file1 删除
\>为 file2 新增
### touch
将文件修改日期更新为当前时间
常用来新建文件
### mkdir
mkdir -p 可以自动创建子目录
### rmdir
删除目录
### tar
tar -c 打包
tar -x 解包
tar -v 可视化
tar -f 不交互
tar 是不压缩的,需要加上-z 变成 gz
tar -zcvf file.tar.gz file
tar -zxvf file.tar.gz
### ln
ln 硬链接
ln -s 软连接
## GCC
### 编译顺序
project
main.c
-src
-incude
-lib
test.c -E(预编译) test.i -S(生成汇编) test.s -c(生成机器码) test.o -o(生成目标文件,连接) test
### 静态库
gcc test.c -c test.o
ar rcs testLib test.o
gcc -Llib -testLib
### 动态库
gcc -fPIC test.c -c
gcc -shared -o testLib.so test.o
gcc -Llib -testLib
## Account
### uid gid
表示用户与组群
文件有owner uid/gid
每个uid有其gid
显示文件时系统需要通过访问/etc/passwd以及/etc/group去将uid/gid转化成实际的用户名与组群名
### /etc/passwd
username : pwd(x见shadow) : uid : gid : desc : home_path : shell_path
uid为0是系统管理员即root
uid为1-499是系统账号,系统服务使用
uid为500-65535即为可登录用户账号
### /etc/shadow
username : pwd(加盐后的) : 最近更改密码的日期(linux时间戳) : 密码不可被更改的天数(0即为可随意更改) : 密码需要重新变更的天数 : 密码需要重新变更的提示天数 : 密码过期后的宽限天数 : 账号失效日期 : 保留字段
### /etc/group
groupname : pwd(x见gshadow) : gid : supported_accounts
## Manage account
### useradd
useradd {username}
useradd -c 描述信息
useradd -s shell_path
useradd -d home_path
useradd -p password
### passwd
passwd {username}
### userdel
userdel {username}
userdel -f 强制
userdel -r 递归删除所有信息
### su
su {username}
su -l 会读取/profile的shell环境变量
exit返回
### sudo
sudo {exec}默认是root
sudo -u 指定用户执行
### /etc/sudoers
username ALL=(ALL) ALL
在任何地方均可运行sudo
### who
### last
### lastlog
# Shell
## Bash
### type
type {name}
type -t file alias builtin
type -p 如果外部命令则显示完整文件名(内部命令则无输出)
type -a 根据PATH变量将所有含有name的命令进行罗列,包括别名
### 变量
echo \${var}
var=x(=无空格,变量名开头不能为数字)
var="lang is \${LANG}"变量可以递归调用
双引号内的特殊字符可以保持原有的特性
单引号内的特殊字符只会保留空格等,\$将会直接被忽略
如果要将\$var的值或一个命令的运行结果赋予另一个变量需要var1=\$(var2)或var1='exec_ret'
export VAR可以使var成为环境变量(环境变量一般使用大写字符)
unset var可以取消变量
### 变量别名
alias cmd="*"
unalias cmd
### 历史
history {num}
history -c清空
history -a将新增的历史数据写入到一个文件
history -r将文件内的内容读入history
history -w将history记录的内容写入文件
history是异步更新,用户在登录态只会存在内存中,断开连接后才会落盘写入文件
!可以匹配历史命令
### Bash环境信息
运行顺序为:当前目录或指定目录->alias->builtin->$PATH搜寻到的命令
Bash启动是会自动从环境变量文件读入变量,分为全局与私有的
non-login shell与login shell读取的配置文件不一致
login shell读取顺序/etc/profile->\~/.bash_profile->~/.bashrc
non-login shell只读取/.bashrc
### 组合按键
| 命令| 效果 |
| -------- | ------------ |
| Ctrl+c | 终止当前命令 |
| Ctrl+d | EOF |
| ctrl+m | enter |
| ctrl+s | 暂停输出 |
| ctrl+q | 恢复输出 |
| ctrl+u | 删除整行命令 |
| ctrl+z | 暂停挂起命令 |
### 通配符与特殊符号
| 符号 | 意义 |
| ----- | ---------------------------------------------------------- |
| * | 代表任意长度的任意字符 |
| ? | 代表一个任意字符 |
| [x] | 代表一个括号内的字符(必须有,非任意) |
| [a-z] | 代表有一个按括号内编码顺序的范围的一个字符(必须有,非任意) |
| [^x] | 代表一个非括号内的字符(必须有,非任意) |
### 数据流的重定向
数据重定向可以将stdin,stdout,stderr传送到不同的设备或位置
exec 1>stdin 2>stderr(>是覆盖,>>是追加)
2>/dev/null可以清除错误信息
2>&1可以将正确与错误信息写入同一个文件
### 命令运行的判断依据
cmd1;cmd2连续命令下达,但不考虑命令连续性即命令与命令之间可能乱序
$?获取前一个命令的返回值 $?=0时即命令运行正确
cmd1 && cmd2 cmd2在cmd1运行完毕且正确时才运行
cmd1 || cmd2 cmd2在cmd1运行完毕但错误时才运行
## Tunnel
管道命令界定符号|
|仅能处理前一个命令的正确输出结果,无法直接输出错误结果
### 颉取命令
颉取命令通常是以行为单位
cut -d 分隔符 -f 第几段
grep -v反向选择
grep -n输出行号
grep -i忽略大小写
常用如
cmd | grep -v pattren1 | grep pattern2
### 排序命令
sort -t 分隔符 -k 第几个
uniq -c 去重计数
wc -l 行
wc -w 单词
wc -c 字符
### 双向重定向命令
tee -a 追加
重定向一个副本至file中
### 字符转换命令
tr -d 删除一个字符串
tr -s 取代重复字符
tr '[a-z]''[A-Z]' 实现大小写转换
tr -d '*'删除内容
col 过滤控制字符
col -x 将tab换成空格
col -b 过滤所有控制符
join -t 指定字段分隔符
join num 指定分析字段
join -1/2 指定分析文件
最好事先sort
paste -d 指定分隔符,默认是tab
paste - 意为来自管道
expand -t num 指定一个tab替代为多少个空格
### 分割命令
split file PREFIX将文件按大小或行数进行分割
split -b 指定分割文件的最大大小
split -l 按行数分割
PREFIX为分割后的文件名的前导符
### 参数替换命令
xargs cmd
xargs -p 提示
xargs -n 一组命令的量
xargs -e'*' 停止命令的标识
能够将一个不支持管道的命令,接受来自其他命令的stdout
### -号
stdin与stdout可以通过-来替代
## 正则表达式
### 特殊字符
egrep "" filename
| Column 1 | Column 2 |
| -------- | -------------------------------------------- |
| ^ | ^word word在行首 |
| $ | word$ word在行尾 |
| . | 一定有一个任意字符 |
| \ | 将特殊符号转义为一般符号 |
| \* | 重复前一个字符,0到无穷多个 .*即为任意字符串 |
| [^] | 舍去或欲求的字符集合 |
| [n1-n2] | 欲求的字符范围 |
| {n,m} | 连续n到m个的前一个字符 |
| + | 一个或一个以上 |
| ? | 0个或1个 |
| \| | 或 |
| () | 组群 |
## 文件格式化与处理
sed -n 安静模式
sed -i 直接修改文件内容
sed -f 写入文件
动作:[n1],[n2]funnction n1,n2为动作施加行
function:a之下追加,c取代,d删除,i之上插入,p打印选择的数据,s替换 如sed '2,5d'
sed s/'pt1'/'pt2'/g 全局替换
awk -F 指定分隔符 awk -F ' ' '$3<10{print $1 "\t" $3}'
diff -Naur oldfile newfile > patch
patch -p0 < patch(oldfile->newfile)
patch -R -p0 <patch(oldfile->newfile->oldfile)
## Shell编程
### 特征
纯文本,从上往下,从左到右
\可以延伸至下一行
/#为注释
/#!/bin/bash
$((运算内容))
### test
test -e dictory
### $特例
$# 参数个数
$@ 输入参数
$n 第n个参数
### 循环
```shell=
if [ * ]; then
do sth
elif [ * ]; then
do sth
else
do sth
fi
while [ * ]
do
do sth
done
until [ * ]
do
do sth
done
for i in $(seq 1 100)
do
do sth
done
for (( i=0; i<=100; i=i+1 ))
do
do sth
done
```