Linux实用知识持续构建——工具篇

这是什么

本文将持续更新在学习Linux过程中,所遇到各种实用工具的实用示例,示例将尽量简洁,且只包含常用场景.

cat

# 不要忘了cat是可以同时显示多个文件的
cat file1 file2 ...

# 合并标准输入和文件
echo 'standout' | cat - file1

# 压缩空白行
cat -s file1

# 显示行号,针对所有行,-b则只针对非空白行
cat -n file1

find

# 未指明搜索条件,则是列出dir目录及其子目录的所有文件
find dir

# 文件名称搜索,*为通配符,匹配任意多的字符,例子即为以Target开头的文件 -iname为忽略大小写
find dir -name "Target*"

# 文件类型搜索,f为文件,d为目录,l为符号链接,s为套接字,p为管道,b为块文件
find dir -type [fdlspb]

# -name匹配的是文件名称,-path则是匹配文件的完整路径

# -path路径不能加入结尾的/,比如路径/vobs/gliethttp/signature,不能写成/vobs/gliethttp/signature/,这是硬性规定

# -prune则指不在-path目录中查找
find dir -path '/home/user/target'

# 否定
find dir ! -name 'Target'

# 多个搜索条件,-o为'或' -a为'与'
find dir -name traget -[oa] -type d

# 指定搜索的最大|小深度,据不可靠消息,深度应该放在搜索条件的第一个,否则系统将搜索出来全部后再过滤层次
find dir -[maxdepth|mindepth] 2 -name 'Target'

# 使用正则表达式搜索,注意匹配的是find的输出结果,而不是如-name那样只匹配文件名
find dir -regex ".*\.jpg"

# 文件大小搜索,'+'为'大于','-'为'小于',不写为等于;
find dir -size [±]2[bcwkMG]

# 'b'    for 512-byte blocks (this is the default if no suffix is used)

# 'c'    for bytes

# 'w'    for two-byte words

# 'k'    for Kilobytes (units of 1024 bytes)

# 'M'    for Megabytes (units of 1048576 bytes)

# 'G'    for Gigabytes (units of 1073741824 bytes)

# 按照时间搜索,首先明白Linux文件系统每个文件都有三个时间戳

# 搜索的单位是天,-n指n天以内,+n指n天以前,无是等于,另外amin|mmin|cmin类似,但单位是分钟
find dir -atime|-mtime|-ctime [±]2

# 访问时间(-atime): 用户最后一次访问文件时间

# 修改时间(-mtime): 文件内容最后一次修改时间

# 变化时间(-ctime): 文件元数据(权限或所有权,即inode)最后一次修改时间

# 按照文件所有者搜索
find dir -user UNAME

# 按照文件权限搜索
find dir -perm 665

# 删除搜索匹配项
find dir [搜索条件] -delete

# -exec选项将会将搜索结果替换{},执行COMMOND命令
find dir -exec COMMOND {} \;

xargs

# 将标准输入转化为命令行参数,比如现在有这样的一个样本
cat args
1
2 2 2
3 3
4

# 将标准输入转化为单行参数,输出 `1 2 2 2 3 3 4`
cat args | xargs

# -n选项指定每行的参数个数,输出
cat args | xargs -n 2
1 2
2 2
3 3
4

# 基本用法,保证每行一个参数,并传递给echo
cat args | xargs -n 1 echo

# 当需要将参数作为指定位置或者作为选项的参数时,可以使用-i选项作为占位符(多个如何替代?),经测试-n与-i不能混用,否则-n失效
cat args | xargs -n 1 | xargs -I{} mv {} dir

tr

# tr可以对标准输入的字符进行替换、删除和压缩,可以将一组字符串转换为另一组字符串,即转换(translate)命令
echo '12345' | tr 12345 abcde

# tr的基本用法,集合12345映射到集合abcde,一一映射;假如前面集合长,则是后面的集合最后一个元素隐式补充到相等长度;如果是后面集合长,多出的将被忽略

# 此外集合也有类似正则的简写a-zA-Z0-9,还有\t \n,特殊字符

# [:alnum:] 字母和数字

# [:alpha:] 字母

# [:digit:] 数字

# [:lower:] 小写字母

# [:upper:] 大写字母

# [:space:] 空白字符

# -d选项为删除
echo '12345' | tr -d 0-2

# -s为压缩多个连续字符为单个字符,常用的为压缩空格、\n
echo '12xxx3xxx45' | tr -s x

# -c选项为求参数补集,例子的意思即为将所有非字母字符替换为0;另一个常见作用是与-d结合使用删除字符
echo '123xx45xxa21' | tr -c [:alpha:] 0

sort

# sort是非稳定的,即除了排序的key外,每次排序的执行结果顺序可能不同

# 依次排序各个文件
sort file1 file2 ...

# 按照数字对文件内容进行排序
sort -n file1

# 逆序
sort -r file2

# 排序同时对重复行只保留一行,注意sort判断重复是依据排序的key,并非完整的行,uniq则为完整的行
sort -u unsorted

# 假如file2中数据存在多列,-k指定使用第二列进行排序
sort -k 2 file1

# 以第二列中的第一个字符到末尾进行排序
sort -k 2.1 file1

# 以第二列中的第一个字符到第二个字符进行排序
sort -k 2.1,2.2 file1

uniq

# 将标准输入中的连续多行只输出一行,“连续多行”就决定了uniq处理的标准输入一般是排过序的,否则无意义
sort unsorted | uniq

# 只显示唯一的行
sort unsorted | uniq -u

# 同时输出行的重复次数
sort unsorted | uniq -c

# -s表示跳过的字符数,另外-f类似,但表示的是忽略的字段数
sort unsorted | uniq -s 2

split

# 以大小切分文件生成诸如`xaa xab xac ...`
split -b 10[c|k|m|g] Bigfile

# 同上,但是以行数切分
split -l 100 Bigfile

# -a选项表示生成的切分文件名的长度,设为4则生成`xaaaa xaaab xaaac ...`
split -a 4 -l 100 Bigfile

# -d选项表示使用数字作为生成文件的名字,如`x001 x002 x003 ...`
split -d -l 100 Bigfile

# 最后一个参数定义切分文件的前缀,如`mypre-001 mypre-002 ...`
split -d -l 100 Bigfile mypre-

# 合并切分文件的方法
cat mypre* > merge

#、%、##、%%

几个运算符的作用是对变量进行处理


# 输出为`test.tar`,%的作用为删除变量右侧与通配符匹配(即.*,匹配.png)符合的
target=test.tar.png; echo ${target%%.*}

# 输出为`test`,%%与%作用一样,但是贪婪匹配,即匹配到了.tar.png
target=test.tar.png; echo ${target#*.}

# 输出为`tar.png`,#的作用为删除变量左侧与通配符匹配(即*.,匹配test.)符合的
target=test.tar.png; echo ${target##*.}

# 输出为`png`,##与#作用一样,但是贪婪匹配,即匹配到了test.tar.

dd


# if为输入文件,/dev/zero为linux特殊设备,会不断产生\0

# of为输出文件

# bs为块大小

# count为块数,即文件最终大小为 bs*count

mkdir

# 用以创建长路径
mkdir -p /this/is/a/long/long/path

touch

‘抚摸’文件,更新文件的所有时间戳

# 更改文件的最后访问|修改|状态改变时间

# *Linux文件有三种时间,访问时间即被读取的时间;修改时间即内容变化时间(ls默认列出);状态改变时间即所有者、权限改变时间*
touch -a|m|c

# 更改文件时间戳为指定时间
touch -t 201501012310.50 file

ln

# 为~目录创建一个名为home的符号链接,可以通过`ls -l`查看,也可以使用`readlink`查看
ln -s ~ ./home

head & tail

# 显示前5行
head -n 5 file

# 显示后5行
tail -n 5 file

# 显示file从N行到结尾
tail -n +(N+1) file

# 动态跟踪file变化,此外`-F`选项甚至可以在文件被重命名后依然跟踪
tail -f file

# 逆序输出
tail -r file

ls

# 列出详细信息
ls -l

# 隐藏文件
ls -a

# 显示目录本身的信息,而不是目录里的内容
ls -d Dir

# 显示本级所有目录,类似还有`ls -F | grep "/$"`,原理是-F选项为在目录后加/,再用grep过滤出来
ls -d */

# 文件大小可读
ls -lh

# 文件按照大小排序,同时使用完整时间模式
ls -lS --full-time

wc

# 计算file的字节数、单词数、行数
wc -c|w|l file

chmod

# 直接修改
chmod 751 file

# 直接修改,但更加便于理解,a=all u=user g=group o=other w=write r=read x=execute
chmod u=wr,go=x file

# 在原基础上对权限进行修改
chmod u+w,g-r file

chown chgrp

# 修改文件的用户组为teachers
chgrp teachers file

# 修改文件的所有者为me,同时用户组修改为teachers
chown me:teachers file

grep

# 基本用法
grep 'php' file
grep "^a-z" file

# 注意{}+|()*在shell里是需要转义的
grep '0\{3,\}' file

# 使用拓展正则模式,此时无需转义
grep -E "^[0-9]{1,3}" file

# 一般用法,高亮显示
STDIN | grep MATCHPATTERN --color=auto

# 反向匹配
STDIN | grep -v MATCHPATTERN --color=auto

# 统计匹配的行数
STDIN | grep -c MATCHPATTERN

# 标记匹配行的行号
STDIN | grep -n MATCHPATTERN

# 忽略大小写
STDIN | grep -i MATCHPATTERN

# 静默,常用于验证
STDIN | grep -q MATCHPATTERN

# 整个单词匹配
STDIN | grep -w MATCHPATTERN

# 找出'test'在哪个文件中,`-L`则恰好相反
grep -l 'test' file1 file2 file3...

# -R|r选项为递归搜索
grep -lnR 'test' .

# 匹配多个模式(或),此外还有另一种写法`grep -f PATTERNFILE`,即将多个模式写在文件中,每行一个
STDIN | grep -e MATCHPATTERN1 -e MATCHPATTERN2 ...

# 输出匹配行的上下文,A为After,B为Before,C为前后各
STDIN | grep test -A|B|C 3

# 以文件的每一行为模式进行匹配
grep -f patternfile file

cut

# 显示file的第一列,关于列的指定
cut -f 1 file

# 1,3,4 显示1、3、4列

# 1-4 显示1到4列

# 2- 显示第2列,直到最后

# -d选项指定分隔符
cut -f 1 -d ',' file

# -s选项用以去掉不含分隔符的列,比如文件中的注释、说明性文字
cut -f 1 -s file

# 显示file的前10个字符,类似的还有-b,显示的字节
cut -c 10 file

wget

# 最基本的用法,从网络中下载文件
wget url1 url2 url3

# -O选项指定输出结果的保存文件,-o选项指定wget执行过程中日志存储文件
wget url1 -O savefile -o logfile

# -c选项断点续传,-t指失败的尝试次数
wget -c -t 3 url1

# --limit-rate 限制下载速度,--quota(-Q)控制下载文件的大小
wget --limit-rate 20[k|m|g] url1 --quota 100m

# -m(--mirror)镜像url1,等价于`wget -r -N 1 -l 3 url1` -r递归,-N使用时间戳,-l指定递归深度
wget -m url1

# 需要http或ftp认证
wget --user username --password pass URL

curl

# curl是比wget更高级的http工具

# curl的基本用法,下载url,--slient表示静默,--progress显示进度条
curl [--slient|--progress] URL

# curl默认将下载的内容输出标准输出,-O则控制curl输出到文件,文件名则自动识别,比如 DOMAIN/index.html则下载至index.html;-o选项则指定文件名,此处也可以看出linux各个命令直接选项的混乱
curl URL [-O|-o newfile]

# 断点续传,可以直接指定续传位置(OFFSET,单位字节),也可以让curl自动推断,`-C -URL`
curl URL -C [OFFSET|-URL]

# 指定(多个)header
curl -H "Host: www.baidu.com" -H "Accept-language: en"

# 只显示响应报文中的头文件
curl -l|head URL

# 设置http中refer
curl --refer http://www.baidu.com URL

# 设置cookie,当使用cookie文件时`curl URL --cookie-jar cookiefile`
curl URL --cookie "user=liufuxin; pass=hack"

# 指定用户代理
curl URL --user-agent "Mozilla/5.0"

# 安全验证
curl -u user:pass URL

tar

# 打包文件,-f参数必须为参数组的最后一项,其后必须紧跟打包文件名
tar -cf demo.tar file1 dir1 dir2

# 向demo.tar中添加文件,注意通路径在打包中会同时存在,但提取时会覆盖
tar -rf demo.tar fileother

# -t输出demo.tar内容至标准输出,v选项控制显示更多信息
tar -tvf demo.tar

# 提取打包文件,也可以指定提取的文件
tar -xvf demo.tar [file1|dir1|dir2]

# 排除通配符文件
tar --exclude '*.svn' -cvf demo.tar *

# 从包中删除文件
tar --delete -f demo.tar dir1

# 将demo2.tar合并到demo.tar中
tar -Af demo.tar demo2.tar

# 打包的同时压缩
tar -cv[j|z]f demo.[gz|bz2].tar *

# 将文件打包压缩到标准输入,然后从标准输出中解压文件;`-a`选项可以根据文件名自动使用何种压缩
tar -cvjf - * | tar -xvjf - -C ./target

gzip、bzip

# 只能对一个文件进行压缩,所以经常和打包命令配合,两者使用方法类似,bzip效率更好一些,解压缩命令为gunzip bunzip

# 生成text.gz同时保留原文件.zsh中直接使用-k即可
gzip -c test > test.gz

# 列出压缩信息,包括压缩前后文件大小、压缩比率
gzip -l test.gz

# 压缩比,1最快(--fast) 9最好(--best)
gzip -[1-9|--fast|--best] test

# 列出压缩文件
gzcat test.gz

# -c选项输出到标准输出
cat test | gzip -c > test.gz

base64

# 编码test,输出到标准输出
base64 test

# 解码
base64 -d test

ping

# ping 10次
ping www.baidu.com -c 10

scp

# 远程递归复制文件夹至本地,反过来即复制到远程
scp -r user@host:/home/path/dir ./

lsof

# list open files,列出被打开的文件,因为Linux中‘一切皆文件’,所以该命令也可以查看打开的网络连接和端口

# 查看file文件被哪些进程占用
lsof file

# -r选项为一直执行losf
lsof -r file

# 显示abc进程打开的文件
lsof -c abc

# 显示PID 123打开的文件
lsof -p 123

# 显示文件描述符(fd)为4的文件被哪些进程打开
lsof -d 4

# 查看用户username的进程打开的文件
lsof -u username

# 查看指定目录下被进程开启的文件
lsof +d mydir1/
lsof -i[4|6] [protocol][@hostname|hostaddr][:service|port]

# 46        IPv4 or IPv6

# protocol  TCP or UDP

# hostname  Internet host name

# hostaddr  IPv4地址

# service   /etc/service中的 service name (可以不止一个)

# port      端口号 (可以不止一个)
lsof -i [email protected]:ftp
lsof -i :3306

netstat

# 用于显示各种网络相关信息

# 列出所有端口
netstat -a

# 列出所有tcp端口,-u为udp
netstat -at

# 只显示监听端口
netstat -l

# 在输出中显示PID和进程名
netstat -p

# 不显示主机、端口和用户名,而用数字代替,可以加速输出
netstat -n

# 每隔一秒输出一次
netstat -c

du

# disk used,磁盘使用情况

# 基本用法,列出文件、目录的大小,单位字节,目录默认只显示其子目录,且显示一层
du file dir1 file2 dir2

# 递归显示所有
du -a dir

# 以可读单位显示,`-b -k -m`字节、kb、mb
du -h dir

# 只显示目录的总计,而不是子目录
du -s dir

df

# 列出磁盘空闲情况
df -h

time

# 列出命令执行时间

# real 开始执行到结束的时间

# user 进程在用户模式的时间,唯一真正用于执行进程所花费的时间(不包括阻塞、挂起)
#sys  花费在内核模式的时间,唯一真正使用CPU的时间
time COMMOND

# 格式化输出
time -f "Real: %e, User: %U, Sys: %S"

watch

# 固定时间间隔监控命令输出

# 默认2秒执行一次,-n指定为5秒
watch -n 5 COMMOND

# 高亮显示区别
watch -d COMMOND

ps

# 列出所有进程信息,默认值显示当前终端进程,`-ax`效果类似
ps -e

# 显示更多信息
ps -e[f|l]

# 指定要显示哪些列,常用的有
ps -ef -o [TargetCol]

# pid

# ppid

# pcpu cpu占用率

# pmem 内存使用率

# comm 可执行文件名

# user 启动用户

# stat 进程状态

# time 累计cpu时间

# 排序,-降序,+升序
ps -ef --sort -pcpu,+time

# -L选项列出线程信息
ps -efL

kill

# 列出所有可用信号
kill -l

# 终止一个进程,默认发送的是SIGTERM信号(15),常用

# SIGHUP 1 挂起

# SIGINT 2 中断,ctrl+c

# SIGKILL 9 强制杀死

# SIGTERM 15 默认的终止进程

# SIGTSTP 20 ctrl+z
kill 13113

# 使用信号编号,或者信号名终止进程
kill -SIGNO | -s SIGNAME 4131

# 杀死进程名的所有实例,类似有`pkill`默认使用进程名
killall processname

which、whereis、locate

查询工具,区别是which是按照PATH变量中的目录逐个查找
而whereis与locate则是在Linux自己维护的文件数据库中查找,所以范围更大,两者区别是locate是模糊查找。缺点是非实时,数据库是每天自动更新,你也可以手动更新,updatedb
另一个是find,速度更慢,但实时的在硬盘查找

file、whatis、uptime

# 列出参数文件的类型描述信息
file file|dir|bin

# 从man中解析出命令的简短描述信息
whatis COMMOND

# 系统使用时间统计,包括最近1分钟、5分钟、15分钟的系统负载
uptime

wall

# 所有终端广播
echo Notice | wall

uname

# 主机名,`hostname`
uname -n

# 打印内核、硬件架构等详细信息
uname -a

# 内核版本
uname -r

# 主机类型
uname -m

logger

# 向系统日志/var/log/message中写入日志

# 直接写入
logger message

# 日志添加标记
logger -t tag message

# 将文件写入日志
logger -f source.log

sar

# u输出cpu使用率; q输出cpu运行进程数,总进程数; r为内存; 1为采集频率,2为采集轮次
sar -[u|q|r] 1 2

crontab

# 指定用户,root使用
crontab -u liufuxin -e

# */5 1,2 5-9 7 * COMMOND

# 每5分 每天的1,2点 每5-9日 每7月 执行任务

# 注意周跟日月不能同时出现,同时出现不是'与'关系,而是'或'关系

# 注意

# Commond的输出未指定的话会发送邮件

展开运算符

# 如果varname未定义,则该表达式值为0
${varname:-word}

# 如果varname未定义,则定义为word,并返回
${varname:=word}

# 如果varname未定义,则输出message,并退出程序
${varname:?message}

参数读取

位置参数

  • $0 命令名
  • 2 第二个。。
  • ${10} 以此类推
    特殊参数
  • $# 参数个数
  • $*、$@ 所有参数的数组
  • "$*" 所有参数组成的单行字符串
  • "$@" 所有参数的数组,比$@方式的优点在于,其保留了参数中任何空白

tee

# tee会将标准输入传送给某个设备的同时将其输出到标准输出
ls | tee lsresult | cat

umask

权限掩码,用于计算文件的默认权限

# 查看
umask

# 编辑
umask 022

# 作用
从777中拿走umask指定的位

# 注意
文件默认不允许添加执行权限,即即使设定umask为000,新建的文件权限也是666,执行权限必须chmod添加;文件没此限制

查看cpu

总核数 = 物理CPU个数 X 每颗物理CPU的核数
总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数

# 查看物理CPU个数
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l

# 查看每个物理CPU中core的个数(即核数)
cat /proc/cpuinfo| grep "cpu cores"| uniq

# 查看逻辑CPU的个数
cat /proc/cpuinfo| grep "processor"| wc -l

top

top 能够实时监控系统cpu、进程、内存状态

# top命令之后
P为cpu使用占比排序
M为内存使用占比排序
i使top不显示任何闲置或者僵死进程

# top第三行显示当前系统的,其中有两个值很关键:
%id:空闲CPU时间百分比,如果这个值过低,表明系统CPU存在瓶颈;
%wa:等待I/O的CPU时间百分比,如果这个值过高,表明IO存在瓶颈;

环境变量

bashrc与profile都用于保存用户的环境信息,bashrc用于交互式non-loginshell,而profile用于交互式login shell。

/etc/profile,/etc/bashrc 是系统全局环境变量设定~/.profile,~/.bashrc用户目录下的私有环境变量设定

当登入系统获得一个shell进程时,其读取环境设置脚本分为三步:

  1. 首先读入的是全局环境变量设置文件/etc/profile,然后根据其内容读取额外的文档,如/etc/profile.d和/etc/inputrc
  2. 读取当前登录用户Home目录下的文件~/.bash_profile,其次读取~/.bash_login,最后读取~/.profile,这三个文档设定基本上是一样的,读取有优先关系
  3. 读取~/.bashrc

/.profile与~/.bashrc的区别:

  1. 这两者都具有个性化定制功能
  2. ~/.profile可以设定本用户专有的路径,环境变量,等,它只能登入的时候执行一次
  3. ~/.bashrc也是某用户专有设定文档,可以设定路径,命令别名,每次shell script的执行都会使用它一次

用户管理

# 添加用户,同时添加home目录
useradd -m liufuxin

# 设置密码
paswd liufuxin

# 删除用户 -r同时删除home目录
userdel -r liufuxin

sed

# 首处替换,替换每一行的第一处匹配的text
sed 's/text/replace_text/' file

# 全局替换
sed 's/text/replace_text/g' file

# 默认替换后,输出替换后的内容,如果需要直接替换原文件,使用-i:
sed -i 's/text/repalce_text/g' file

# 移除空白行
sed '/^$/d' file

#变量转换,已匹配的字符串通过标记&来引用.
echo this is en example | sed 's/\w+/[&]/g'
$>[this]  [is] [en] [example]

# 子串匹配标记,第一个匹配的括号内容使用标记 1 来引用
sed 's/hello\([0-9]\)/\1/'

# 双引号求值,sed通常用单引号来引用;也可使用双引号,使用双引号后,双引号会对表达式求值:
sed 's/$var/HLLOE/'

# 当使用双引号时,我们可以在sed样式和替换字符串中指定变量
p=patten
r=replaced
echo "line con a patten" | sed "s/$p/$r/g"
$>line con a replaced

# 字符串插入字符:将文本中每行内容(ABCDEF) 转换为 ABC/DEF:
sed 's/^.\{3\}/&\//g' file

你可能感兴趣的:(Linux实用知识持续构建——工具篇)