自用-linux常用命令(bash+script)
自用-linux常用命令(bash+script)
自从接触了linux以后,发现有大量需要记忆的指令,尽管我能够通过man或者info来查询这些指令的信息,但是如果我不知道这些指令的名字也是没有办法的事情,因此这里把一些常用的指令名称记录下来。
linux的文件权限与目录配置
-rw——- 1 shuwen shuwen 29957 8月 2 09:35 .bash_history
解读:
- 代表文件类型,常见的有:[d], [-], [l] (link file), [b] (装置文件里可供储存的接口设备,可随机存取装置,block device ), [c] (装置文件里串行端口设备,如键盘,鼠标,一次性读取装置 character device ) , [s] (数据接口文件 ,资料接口文件 ,sockets ), [p] (数据输送文件 ,FIFO, pip )
- 剩下三组分别表示文件拥有者,群组,其他人的权限
- 第二栏表示有多少档名连结到此节点(i-node),包括hard-link 和 Sympolic-link
- 第三,四栏表示拥有者和群组
- 第五栏表示文件容量大小(bytes)
- 第六栏表示建档日期或者最近修改日期
- 第七栏为档名
更改文件属性与权限
chgrp, chown, chmod (改变文件权限,SUID, SGID, SBIT等特性)
eg: chmod u=rwx, go=rx .bashrc
eg: chmod 777 .bashrc
eg: chmod a+x .bashrc
note : 区分文件夹和文件的x属性(前者是可工作权限,后者是可执行权限)
linux文件与目录管理
cd , pwd , mkdir , rmdir
$PATH
cp , rm , mv , rename,
取得路径的文件名与目录名称:basename , dirname
文件内容查阅
cat , tac(cat倒过来写,即从最后一行显示), nl(显示并输出行号) , more , less , head, tail , od(以二进制的方式读取文件内容)
修改文件时间或建置新档
touch
mtime: modification time, 文件内容(不是属性或者权限)改变时更新
ctime: status time, 状态改变(属性或者权限)
atime: access time, 访问后更新,如cat就能改变
文件与目录的默认权限与隐藏权限
chattr, lsattr:改变,查看隐藏权限
umask: 文件预设权限(显示被剪掉的权限)
文件特殊权限
SUID(4): 执行者将暂时具有该程序拥有者的权限,eg: passwd指令执行后,user将暂时拥有root权限,可以修改密码(因为密码文件对外人是不可修改的)。
SGID(2): 对文件:执行者暂时获得群组的支持;对目录:若user在此目录下拥有w权限,则user建立的文件,其群组与此目录群组相同
SBIT(1): 只对目录有效,当user具有wx权限,并且在该目录下建立文件或者目录时,仅自己和root才有权力删除该文件(即使对方有w权限也不能删我的文件)
可见,后两个权限可以大大提高群组合作的效率和安全性
观察文件类型
file
指令与文件搜寻
which: 脚本文件名搜寻,(根据PATH环境变量搜寻)
文件档名搜寻
whereis
locate/updatedb
find
vim程序编辑器
常用快捷键:
nG: 跳转到第n行
0, $: 移动到这一行的第1(最后)列。
/word ?word: 向下(上)查找,使用(n ,N上下查询)
:n1, n2 s/word1/word2/g(c): 在两行之间寻找并替代字符串,加c确认
ndd: 删除向下n行
dG: 删除到最后一行的所有数据(d1G: 到第一行)
d$: 删到这行最后一个字符(d0: … )
nyy: 复制几行
y1G, yG, y0, y$: 同理dd
p, P: 粘贴在下(上)一行
u: 撤销
ctrl + r: 重复上个动作(等价于按键[.])
a, i, o(A, I, O): 都是插入
r, R: 小写取代一次,大写进入取代模式,esc退出
:w ! 强制保存
:w filename 另存为
:r filename 将文件内容添加到光标的后面
:! command 暂时离开vi界面,执行command
区块选择
v: 字符选择,将光标经过的地方反白选择
V: 行选择,
ctrl + v: 区块选择
y: 复制
d: 删除
p: 将刚刚复制的区块粘贴到游标所在处
多文件编辑
:n N 编辑下(上)个文件
:files 列出目前这个vim开启的所有文件
多窗口功能
:sp filename 文件分区显示(默认为当前文件)
ctrl + w + 方向: 上下翻页
挑字补全功能
ctrl + x -> ctrl + n, f, o: 补齐方式:文件的内容文字,文件名,vim内建关键词
BASH相关
type: 显示指令类型
变量
echo : 打印到屏幕,取用变量
unset: 取消设定变量
env: 观察环境变量
set: 观察所有变量
$: shell 的PID变量
?: 上一个指令的回传值变量
export: 自定义变量转环境变量
locale: 影响显示结果的语系变量
read: 读取变量
declare/typeset: 宣告变量类型
ulimit: 与文件系统及程序的限制关系(可以查看栈空间大小)
变量的删除、取代和替换
echo ${path#/*local/bin:} : 从变量最前面开始向右删除,并且删除最短的那个
eg: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
变成 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
echo ${path##/*:} : 删除最长的那个
eg: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
echo ${path%:*bin} : 从后向前删除(%,%%规则与上同理)
echo ${path/sbin/SBIN} : 取代第一个遇到的
echo ${path//sbin/SBIN} : 取代所有
有种憨憨办法,把变量内容输出到一个临时文件里修改,在把它拷贝回来,就不用记这么多指令了,不过,如果要写shell script的话,这些指令还是很有必要记忆的。
变量的测试和内容替换
username=${username:-default} : 如果username为空或者未设定,则设定default,否则设定为username(常和read连用以避免用户输入为空)
var=${str:?expr} : 当str为空或者未设定时,expr输出至stderr,否则var=$str
命名别名设定
alias, unalias
历史命令
history
终端机环境设定
stty -a: 显示所有stty参数
set: 设定整个指令的输出/输入环境(eg: set -u 当使用未设定变量时,会显示错误讯息)
ctrl + C: 终止目前指令
ctrl + D: 输入结束
ctrl + S: 暂停屏幕输出
ctrl + Z: 暂停目前命令
通配符与特殊符号
*: 0~无穷多个任意字符
?: 一定有一个任意字符
[]: 一定有一个在括号内的字符,eg: [abcd]代表一定有a~d 中的一个
[-] : 在编码顺序内的所有字符,eg: [0-9]
[^] : 反向选择,一定无括号内的字符
数据流重导向
2>&1 : 将错误信息和正确信息都输出到指定位置并且不会发生混乱
cat > catfile :利用cat来建立一个文件的简单流程,ctrl + D 终止
cat > catfile < ~/.bashrc : 将.bashrc中的数据输出到catfile中
cat > catfile << “eof” : 将输入信息输出到catfile中,遇到eof 结束
命令执行的判断依据
; , && , ||
| :管线命令,仅能处理经由前面一个指令传来的正确信息,对standard error没有直接处理的能力。
撷取命令
cut : 取出一行信息中想要的
cut -d ‘分隔符’ -f 分割区间
cut -c 12-14 取出字符在12-14之间的数据
grep: 分析某一行的信息
排序命令
sort: 依据某种方式排序
sort - t ‘:’ -k 3 以某个区间进行排序
uniq: 将重复资料仅一行显示
uniq -c 进行计数
wc: 计算文件里的字,行和字符数目
双向重导向
tee: 将标准输出到指定文件和屏幕上
tee [-a] filename (-a 以累加的方式进行)
字符转换命令
tr: 删除一段讯息当中的文字,或者进行文字讯息的替换
tr [-ds] set1 …
-d : 删除set1字符串
-s : 替换重复字符串
eg: 将小写转大写 last | tr ‘[a-z]’ ‘[A-Z]’
col : col -x 将tab转space
join : 处理两个文件,当有相同数据的一行,将他们整合到一起
eg:
==> /etc/passwd <==
root: x:0:0:root:/root:/bin/bash
daemon : x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin: x:2:2:bin:/bin:/usr/sbin/nologin
==> /etc/group <==
root: x:0:
daemon: x:1:
bin: x:2:
>> join -t ‘:’ -1 4 /etc/passwd -2 3 /etc/group | head -n 3
join: /etc/passwd:6: is not sorted: games: x:5:60:games:/usr/games:/usr/sbin/nologin
join: /etc/group:11: is not sorted: uucp: x:10:
0:root: x:0:root:/root:/bin/bash:root: x:
1:daemon: x:1:daemon:/usr/sbin:/usr/sbin/nologin:daemon: x:
2:bin: x:2:bin:/bin:/usr/sbin/nologin:bin: x:
paste: 将两行贴在一起,中间以tab(默认)分开
expand: 将tab 转换成space
分区命令
split: 将大文件分成小文件
eg : cd /tmp; split -b 300k /etc/services services
再合并起来: cat services* >> servicesback
参数代换
xargs: 将stdin的资料分割成为args
eg: 将/etc/passwd 内的第一栏取出,仅取三行,使用id将每个账号内容显示出来
cut -d ‘:’ -f 1 /etc/passwd | head -n 3 | xargs -n 1 id
eg: 将所有/etc/passwd内账号都用id查找,但查到sync就结束
cut -d ‘:’ -f 1 /etc/passwd | xargs -e ‘sync’ -n 1 id
正规表示法与文件格式化处理
用途:处理字符串
基础正规表示法字符汇整
^word : 待搜寻字符串在行首
word$: … 在行尾
. : 代表一定有一个任意字符
: 跳脱符
* : 重复0到无穷多个前一个字符(任意字符表示为.*)
[list] : 字符集合,里面列出想要撷取的字符
eg: a[afl]y -> aay, afy, aly
[n1-n2] : 列出想要撷取的字符范围
[^list] : 不想要的
\{n, m\} : 连续n-m个前一个字符
eg: grep -n ‘go\{2, 3\}g’ filename 找出含有goo或gooog的行
sed: 将数据进行取代、删除、新增、撷取(倾向于一整行处理)
eg: sed ‘s/要被取代的字符串/新的字符串/g’
文件的格式化与相关处理
printf: 格式化打印
awwk: 一行当中分成数个字段来处理
eg: 显示last中的账号与ip
last -n 5 | awk ‘{print $1 “\t” $3}’
awk内建变量:
NF: 每一行拥有的字段总数
NR: 目前awk所处理的是第几行的数据
FS: 目前的分隔字符,默认空格
eg: 查阅/etc/passwd中第三栏小于10的数据,并且列出账号与第三栏
cat /etc/passwd | awk ‘BEGIN {FS=”:”} $3 < 10 {print $1 “\t” $3}’
文件比对工具
diff, cmp
patch: 将旧文件升为新文件,-R可以还原(git 原理)
Shell Scripts
#!/bin/bash: 声明使用的shell 名称
var=$((运算内容)):进行数值运算的格式
bash(sh) script: 直接执行方式,会创建一个新的bash 环境来执行脚本内的命令
source script: 在父程序中执行
利用test指令的测试功能
文件类型判断: -e -f -d
文件权限侦测:-r -w -x -u(SUID) -g(SGID) -k(SBIT) -s(是否为空白文件)
文件比较:-nt (newer than)file1 比 file2 新 ,-ot(older than) -ef
整数判定:-eq -ne -gt -lt -ge -le
判定字符串:-z string , == , != ,
多重条件判定: -a -o !
[] : 判断符号
$0, $1, $2 … : args
$#: 后接的参数个数
$@: 所有非首个args
$*: 代表$1c$2c$3c… ,默认c为空格
条件判断和函数
if [ .. ] ;then
elif [ .. ] ; then
else
fi
case $变量名称 in
“第一个变量内容”)
程序段
;;
…
*) 其他值
;;
esac
function fname() {
程序段
}
循环
while []
do
…
done
until []
do
…
done
for var in con1 con2 con3 …
do
…
done
for((初始值; 限制值; 执行步阶))
do
…
done
eg: for((i = 1; i <=${nu} ;i=i+1))
do
…
done
shell script的追踪与debug
硬件,操作系统问题汇总
CPU:
CPU的工作频率:内频,外频,倍频,超频
- 内频:每秒工作次数
- 外频:CPU与外部组件的数据传输速度
- 倍频:CPU内部加速工作效能的倍数
- 外频*倍频=CPU频率速度
- 超频:强行提高外频或者倍频
大概相当于,在一个车间内,零件的运输速度和加工速度相同时效率才能最高,而一般情况下,内频的速度会快很多,因此为了减少时间的浪费,需要主动给外频增加倍数。
CPU的总线宽度:32,64位
CPU对主存储器的工作频率 * 位数 = CPU从内存中取得的最快带宽
一般来说,CPU的运算速度是很高的,所以可以一次执行多个任务(多线程),这就仿佛一个人的能力远远大于他需要处理的工作量,这当然是资本家最欣慰的事情。
内存:
主存储器为动态随机存取内存(DRAM),断电以后数据全部消失
DDR(双倍数据传送速度)
多通道设计:增加主存储器的个数以增加宽度
SRAM(静态随机存取内存)
L2 cache(第二层快取)
ROM(只读存储器),用来存放一些非常重要的数据(如开关机必须用到的BIOS,控制着开机时各项硬件参数的取得)
硬盘与存储设备:
硬盘:
- 扇区(sector):最小物理存储单位(一维)
- 磁道(track):同一个同心圆的扇区组合成的圆(二维)
- 磁柱(cylinder):所有磁盘盘上面的同一个磁道组成(三维)
磁盘与主板的传输界面:
- SATA界面
- SAS界面:串行式SCSI,拥有更快的接口速度,SAS硬盘的磁盘盘转速与传输速度也比SATA好,但是价格贵。
- USB界面
固态硬盘(SSD):
区别于传统的机械磁盘(HDD),没有马达不需要转动,而是通过内存直接读写
CMOS与BIOS:
CMOS:记录主板上面的重要参数
BIOS:写入到主板上的某一块flash挥着EEPROM的程序,它可以在开机的时候执行,加载CMOS当中的数据。
操作系统:
通常由核心和系统呼叫接口组成,其中核心将硬件联系起来,不同的硬件需要设计不同的核心,而用户又通过接口来运作核心,核心调度硬件进行数据的存储和运算。不同的操作系统有不同的开发接口,因此针对其开发的应用程序也是专一性的。
核心功能:
系统呼叫接口:方便程序开发者与核心沟通。
程序管理:CPU安排任务的运作顺序
内存管理:分配,释放内存
文件系统管理:如数据的I/O工作,不同文件格式的支持
装置驱动:由核心管理。
Linux磁盘与文件系统管理
文件系统Ext2/3/4:
superblock: 记录filesystem 的整体信息,包括inode/block的总量,使用量,剩余量,以及文件系统的格式和相关信息。
inode: 记录文件的属性和block号码(在一个filesystem下,一个文件对应一个inode)
block: 实际记录文件内容,文件太大时会占用多个block,一个block只能最多放置一个文件的数据
格式化以后,inode和block的编号和空间就不再发生改变。
数据读取方式:
- 索引式文件系统:inode直接记录下block的号码,能够实现快速查找
- FAT文件系统(FAT是win的一种filesystem): 通过链表的方式记录block的位置,类似于1->7->4->15,因此如果数据太离散,磁盘可能需要转很多圈才能读取到文件的全部数据。
inode table:
该文件的存取模式(rwx)
该文件的拥有者和群组(owner/group)
该文件的容量
该文件建立和状态改变的时间(ctime),最近一次读取时间(atime),修改时间(mtime)
该文件真正内容的指向(pointer)
如果文件太大,inode存不下所有block的编号(inode只有128bytes), 就会间接拿一个block来记录
dumpe2fs: 查询Ext家族superblock信息的指令
Usage: dumpe2fs [-bh] device_name
缓存快取:有些文件经常读取,可以放在内存的缓冲区中
目录树:建立目录时,文件系统会分配一个inode与至少一块block给该目录,而该block中会记录文件的inode
挂载:将文件系统与目录树结合,即设定挂载点一定是目录,该目录为文件系统的入口
VFS(Virtual Filesystem Switch): 用来管理所有的文件系统
示意:
user process -> (kernel)systemcall -> VFS-> XFS,DOS,Ext4…filesystem ->缓存快取->驱动程序->磁盘装置控制器
文件系统的简单操作:
df: 列出文件系统的整体磁盘使用量
du: 评估文件系统的磁盘使用量(常用在推测目录所占用容量)
实体链接与符号链接:ln
hard link: 实体链接,多个档名对应到同一个inode号码,因此可以使用不同的名称访问到相同的存储空间,即使不小心将档名删除了,inode和block还是存在的。不能跨filesystem, 不能link目录。
Symbolic Link: 快捷方式,如果删除原档名此文件将失效!
ln: ln [-sf] source goal
-s symbolic link
-f 如果目标文件存在,就主动将目标文件移除后再建立
当新建一个目录时,新的目录link数为2(dir/, dir/.), 上层目录的link数会增加1(dir/..), 这就是为什么总能回到上级目录。
磁盘的分区、格式化、检验与挂载:略过,需要的时候再baidu,常用指令:gdisk, fdisk, mkfs, mount
Ext4文件系统主要有:boot sector, superblock, inode bitmap, block bitmap, inode table, date block
文件block记录文件实际数据,目录的block则爱记录该目录底下文件名与其inode号码对照表
日志文件系统会多处一块记录区,随时记载文件系统的主要活动,可加快系统复原时间
压缩,打包
常见扩展名:*.tar, *.tar.gz, *.tgz, *.gz, *Z, *bz2, *xz
tar: 将多个文件打包成一个文件,便于压缩
账号管理 与ACL权限设定
UID: User ID
GID: Group ID
/etc/passwd:
每行代表一个账号,结构如下:
root: x :1:1: root : /root : /bin/bash
- 账号名称
- 代表密码,放在shadow中
- UID: 0(管理员),1
999(系统账号)(1200:由distributions自行建立的系统账号, 201999: 若用户有系统账号需求时,可以使用的账号UID),100060000(给一般使用者使用) - GID: 同UID
- 用户信息说明栏(使用finger时有用)
- 家目录
- Shell
/etc/shadow:
root : $6$wtb… … YLP3fsF3t : 16559 : 0 : 99999 : 7 :::
- 账号名称
- 密码(加密)
- 最近更动密码的日期(以1970.1.1为1往上累加日期,如1971.1.1 为366)
- 密码不可被更动的天数(与第3字段相比):0表示随时可以更改
- 密码需要重新变更的天数(与第3字段相比):99999(273年)表示除非你是DIO,否则不必强制更改:)
- 密码需要变更期限前的警告天数(与第5字段相比):prompt:再过n天密码就要过期了,请尽快重置密码!
- 密码过期后的账号宽限时间(密码失效日)(与第5字段相比):一般情况下,密码过期后系统会强制重设密码,但失效后就 再也无法登陆了
- 账号失效日期:使用自1970年来的总日数设定,在此日期之后,将无法使用。
- 保留功能
/etc/group:
root : x : 0 :
- 组名
- 群组密码(放在gshadow中,没什么卵用)
- GID
- 此群组支持的账号名称,eg: root : x : 0 : dmtsai, alex
初始群组:默认为与账号名称相同的群组
有效群组:新建文件或者目录时赋予的群组
groups: 查看当前账号所属的群组,第一个为有效群组
newgrp: 有效群组的切换,eg: newgrp users, 但只能切换为支持你的群组
/etc/gshadow:
root:::
- 组名
- 密码栏,为空或!表示无合法密码,无群组管理员
- 群组管理员账号
- 有加入该群组支持的所属账号(与/etc/group相同)
账号管理
useradd : 添加账号,默认直接添加输入的用户名
useradd参考档:/etc/default/useradd, /etc/login.defs, /etc/skel/*
passwd: 为特定用户修改密码
chage: 详细的密码参数显示功能,显示最近修改日期,失效日期等等
usermod: 修改账号信息(类似于useradd)
userdel: 删除用户数据
id: 查询某人或自己的相关UID/GID等等的信息
finger: 查询/etc/passwd文件内的信息
chsh: 改变shell