Linux 命令和工具学习笔记
掌握一些 Linux 命令行及标准实用工具, 可以大大加强日常任务的处理效率,作为开发的有力辅佐。这篇文章将专注于有用的命令及组合, 记录我在日常生活与工作中遇到的问题及解法。
1. Linux 强力工具:
find : 提供 N 多搜索选项, 在目录结构中寻找满足各种条件的文件集合; --- 搜索文件
grep : 依靠强大的正则表达式, 在给定文件集合中搜索匹配模式的文本字符串; --- 搜索字符串
sed : 同样依靠强大的正则表达式及编辑命令,执行文本查找/替换; --- 文本查找与替换
awk : 特别适合于记录文件的数据处理; --- 记录文件处理
sort: : 提供了很多选项对记录型文件和非记录型文件的排序; --- 排序
man : 详细的可读性良好的帮助信息 , --help , info ; --- 帮助
2. Linux 常用命令及Shell 重要元素:
(1) 常用命令:
echo: 回现内容;
cat: 显示文件内容; head:显示文件前若干行; tail: 显示文件末尾若干行;
pwd: 显示当前所在目录;
ls: 获取当前目录下文件与目录列表及详情;
wc: 对文件进行单词、字符、行计数;
cut: 截取文件记录行的某列或某几列;
join: 连接多个文件的记录列;
tr: 字符串截取 ; tee: 字符串转换;
uniq: 重复行处理;
cd: 切换目录;
cp : 复制文件或目录; mv ; 移动文件或目录; 重命名文件; rm: 删除文件或目录;
mkdir : 创建目录;
which: 定位命令所在路径; whereis : 找出命令相关的文件及路径;
who: 显示当前登录用户;
chmod:更改文件权限;
touch: 改变文件创建或修改时间, 可用于创建空文件;
file: 显示文件类型;eg. ls | xargs file ;
xargs: 将前一个命令的输出转化为文件列表作为指定命令的输入, 常见形式是 cmdx | xargs cmdy
df : 磁盘使用情况;
md5sum: 获取 md5sum 值;
. xx.sh, sh xx.sh : 执行脚本 xx.sh ;
read: 从控制台读取输入;
export: 导出变量到当前 SHELL 环境;
env : 显示或设置环境变量;
kill: 杀死进程, 一般使用 ps 命令找到相应进程的进程ID,然后使用 kill 干掉; eg. kill -9 pid
ps: 显示进程信息, 一般使用 ps aux ;
top: 系统最近一段时间的负载;
fc : fc命令自动调用vi编辑器修改已有历史命令,当保存时立即执行修改后的命令,也可以用来显示历史命令;
fg: 将后台任务提到前端来执行;
crontab: 设置定时任务;
history : 显示历史命令; !n 执行历史命令中的第n条;
(2) 重要符号
cmdx | cmdy : 管道, 将 命令 cmdx 的输出作为 cmdy 的输入;
cmd < file: 重定向输入, 从指定文件 file 读取内容作为 cmd 的输入;
cmd > file : 重定向输出, 将命令 cmd 的输出到从控制台的内容重定向到指定文件 file 中(若 file 已存在则覆盖其内容);
cmd >> file: 追加重定向输出, 与 > 类似, 但是输出是追加到 file 中, 而不是覆盖 file 已有内容;
cmdx && cmdy: 命令组合串行执行。 若 cmdx 执行成功,则执行 cmdy, 否则报错, 并且不执行 cmdy;
cat /dev/null > file : 清空 file 文件内容 ;
cmd & : 将命令转入后台执行;
(3) 常用变量(可使用 echo $xxx 显示相关内容)
$HOME: 用户主目录, 一般是 /home/your_user_name , 同 ~ ; env 命令可显示当前用户的环境变量设置。
$IFS: 文件记录分隔符, 将文件中每行的记录使用 $IFS 定义的变量进行分割。
$PWD: 当前所在目录。
$PS1, $PS2: Shell 提示符定制, 一级提示符及二级提示符。
$((EXPR)): 表达式计算; eg. echo $((1+2)) 。
${cmd-replacement}: eg. 命令行结果替换, 效果类似 cmd-replacement | cat | 。
$#: 命令行参数数目
$@: 命令行参数
$* : 命令行参数
$1-$9, ${10-...}: 取出指定命令行参数; $0: 脚本名称;
$? : 上次命令执行的状态码, 可判断上次命令是否成功, 0 表示成功; eg. ls ; echo $? ; ls notExist ; echo $?
$$ : 脚本运行的当前进程ID号
[ ]: 取索引的相应值
&n: 在重定向中, n 是文件描述符。
. 当前目录 ; .. 上级目录
(4) 控制结构
条件语句: if cond then statement elif cond2 then statement2 ... else statement3 fi;
for 循环: for var in $@ do ... done ;
变量替换: ${varname:-word}, ${varname:=word}, ${var#pattern} , ${var##pattern}, ${var%pattern}, ${var%%pattern} ,
switch-case: case $var in patt1-N) dosome ;; esac ;
(5) 内置命令
任选一个使用 man 命令可查看所有内置命令的解释
set/unset: 设置/取消变量值 ;
readonly: 设置变量值为只读 ;
printf: 打印内容到控制台 ;
getopts: 命令行解析 ;
exit: 退出程序 ;
test:条件测试 ;
eval: 计算表达式的值 ;
sleep: 休眠若干秒 ;
trap: 捕获信号 ;
type: 内置命令; 使用 man type 可以看到所有内置命令的权威解释;
shift: 数组移动 ;
exec ; 执行指定命令;
at: 任务延迟执行;
(6) 重要文件:
/proc/pid : 进程相关信息;
3. 命令组合:
(1) sed -i 's/@Override//g' $(find . -name '*.java')
find . -name '*.java' | xargs sed -i 's/@Override//g'
此命令用于将当前目录及其子目录下的所有 .java 文件中的 @Override 注解去掉。 $(find . -name '*.java') 使用了命令替换功能, Shell 会将该命令执行得到的结果作为 sed 的输入参数。 sed 是文本替换的重要工具, -i 是就地置换,直接在被编辑文件中置换,如果没有的话是不会修改原文件的,只会将修改输出到标准屏幕上。 's/oldtextpatt/newtext/g' 称为 sed 命令的编辑命令, 可以执行全局替换, 将所有匹配 oldtextpatt
的文本替换为 newtext . 还可以将多条编辑命令写在文件里,比如 pat_file , 然后用 -f pat_file 来调用。
由于命令行的长度有限, 而 find 找到的文件都将作为命令行参数,有可能超出限制, 因此, 更好的解决方案是使用 xargs , 它读取管道输入并转化为紧随其后的命令的参数, 从而不担心受到命令行字符长度限制。
扩展: *.java 是文件匹配形式, 可以换成 *.c , *.h , *.{c,java,h,deb,tar.{gz,bz2},js,php,html}(注意,中间不能有空格) 等;
重要工具: sed , find ,
重要概念: 正则表达式。 用来描述文本的模式,最重要最强大的 Unix 工具均建立其基础上 , find, sed, awk , grep 等。比如 a* 用来描述零个或多个a ; [1-9]*[0-9]+ 可以匹配任何整数。 推荐 《正则表达式必知必会》, 薄薄的100多页, 相当好的正则入门书籍。
(2) while IFS=: read var1 var2 ... varN do ... done < inputfile ;
cmd | while IFS=: read var1var2 ... varN do .... done
将输入文件或管道输出的每一行数据用 IFS 分割成多个字段然后赋值给 var1, var2, ..., varN 进行某种处理,
直到输入文件或管道输出的所有行都读完为止。
(3) find . -name '*.java' | xargs awk ' $0 ~ /vm_monitor/ { printf "%s : Line %s :\n%s \n" , FILENAME, FNR, $0 } '
| sed 's/^[[:space:]]\{1,\}/ /'
在当前目录及子目录下的所有 .java 文件中查找匹配模式 vm_monitor 的字符串,显示文件名,行号及匹配的行内容。
(4) grep 'inconsistency' log.txt | cut -f 3 -d":" | sed "s/ //g"
从文本中截取感兴趣的文本(订单号)。 grep 先通过文本模式过滤出含有感兴趣文本的行; cut 剪切出指定的感兴趣的文本段; sed 去掉空格。
log.txt
日志概况: 2019-10-16 02:51:45 host/10.19.89.203 warn
日志内容: uuid c.y.t.t.delay_compare-task - state-inconsistency: E20191016024042035800001
引用: