自用-linux常用命令(bash+script)

自用-linux常用命令(bash+script)

自从接触了linux以后,发现有大量需要记忆的指令,尽管我能够通过man或者info来查询这些指令的信息,但是如果我不知道这些指令的名字也是没有办法的事情,因此这里把一些常用的指令名称记录下来。


linux的文件权限与目录配置

-rw——- 1 shuwen shuwen 29957 8月 2 09:35 .bash_history

解读:

  1. 代表文件类型,常见的有:[d], [-], [l] (link file), [b] (装置文件里可供储存的接口设备,可随机存取装置block device ), [c] (装置文件里串行端口设备,如键盘,鼠标,一次性读取装置 character device ) , [s] (数据接口文件 ,资料接口文件 ,sockets ), [p] (数据输送文件 ,FIFO, pip )
  2. 剩下三组分别表示文件拥有者,群组,其他人的权限
  3. 第二栏表示有多少档名连结到此节点(i-node),包括hard-link 和 Sympolic-link
  4. 第三,四栏表示拥有者和群组
  5. 第五栏表示文件容量大小(bytes)
  6. 第六栏表示建档日期或者最近修改日期
  7. 第七栏为档名

更改文件属性与权限

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

  1. 账号名称
  2. 代表密码,放在shadow中
  3. UID: 0(管理员),1999(系统账号)(1200:由distributions自行建立的系统账号, 201999: 若用户有系统账号需求时,可以使用的账号UID),100060000(给一般使用者使用)
  4. GID: 同UID
  5. 用户信息说明栏(使用finger时有用)
  6. 家目录
  7. Shell

/etc/shadow:

root : $6$wtb… … YLP3fsF3t : 16559 : 0 : 99999 : 7 :::

  1. 账号名称
  2. 密码(加密)
  3. 最近更动密码的日期(以1970.1.1为1往上累加日期,如1971.1.1 为366)
  4. 密码不可被更动的天数(与第3字段相比):0表示随时可以更改
  5. 密码需要重新变更的天数(与第3字段相比):99999(273年)表示除非你是DIO,否则不必强制更改:)
  6. 密码需要变更期限前的警告天数(与第5字段相比):prompt:再过n天密码就要过期了,请尽快重置密码!
  7. 密码过期后的账号宽限时间(密码失效日)(与第5字段相比):一般情况下,密码过期后系统会强制重设密码,但失效后就 再也无法登陆了
  8. 账号失效日期:使用自1970年来的总日数设定,在此日期之后,将无法使用。
  9. 保留功能

/etc/group:

root : x : 0 :

  1. 组名
  2. 群组密码(放在gshadow中,没什么卵用)
  3. GID
  4. 此群组支持的账号名称,eg: root : x : 0 : dmtsai, alex

初始群组:默认为与账号名称相同的群组

有效群组:新建文件或者目录时赋予的群组

groups: 查看当前账号所属的群组,第一个为有效群组

newgrp: 有效群组的切换,eg: newgrp users, 但只能切换为支持你的群组


/etc/gshadow:

root:::

  1. 组名
  2. 密码栏,为空或!表示无合法密码,无群组管理员
  3. 群组管理员账号
  4. 有加入该群组支持的所属账号(与/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


自用-linux常用命令(bash+script)
http://example.com/2023/01/10/自用-linux常用命令(bash+script)/
作者
Chen Shuwen
发布于
2023年1月10日
许可协议