在线网站可以找到基本的东西:Linux命令大全 shell 正则表达式
文件&内容检索
正则表达式注意的地方
- 花括号之前要加转义字符
[a-z]\{3\}
- 空格就是转义加空格
\
,而不是\s
。如[a-z0-9_\ ]\{3,\}
- 这几个符号
_ - . #
都不需要加转义符。 - 不要轻易加==行结束符==$,可能回车才是最后符号,所以可能找不到。
grep
1 | # -r 递归搜索子目录 |
更多参数请读此文 示例脚本
grep
正则表达式的例子
1 |
|
grep或操作
1 | grep -E '123|abc' filename // 找出文件(filename)中包含123或者包含abc的行 |
grep与操作
1 | grep pattern1 files | grep pattern2 //显示既匹配 pattern1 又匹配 pattern2 的行。 |
其它常用选项
1 | grep -i pattern files //不区分大小写地搜索。默认情况区分大小写, |
sed 命令
文本替代
以下文本替换通过pandoc
导入后的文件,残留很多内部跳转链接:如
1 | {#part0000_split_003.html#nav_point_1 .not-in-toc} |
1 |
|
整行替代
替代以 categories:
开头的整行(允许行开头有空格或制表符)。c
代表整行,以字符串 categories: [IE] 替代整行。
1 | # Linux 下的写法 |
错误:如果将参数 c
写在前面,会将整个文本每一行都替换掉。
1 | # Linux 下的写法 |
find
1 | # 查找所有的 md 文件 |
如果要处理复杂的事情,就要用到函数
1 | # 定义函数 |
查找最新文件
-
将文件按从新到旧排列,取第一个。
ls -t *.cpp | head -1
-
将文件按从旧到新排列,取最后一个。
ls -rt *.cpp | tail -1
-
列出文件时间戳
ls -l simpleNode.js |awk '{print $6 "-" $7 "-" $8 }'
-
整合以上两个命令,找到最新的文件,读取时间戳
ls -t *.* | head -1 | xargs ls -l | awk '{print $6 "-" $7 "-" $8 }'
字符串处理
配合使用,可以直接用 shell 实现文件内标签和分类的替换。
数组转字符串
使用分隔符将数组转字符串:
1 | ids=(1 2 3 4); |
字符串转数组
字符串替换
1 | # 原串 [娱乐,经济,重要] => 目标串 [娱乐, 经济, 重要] |
消除回车符、换行符、制表符
1 | # arg是个字符串变量, 可能带有回车符\r |
详细用法
${var##*/}
该命令的作用是去掉变量var从左边算起的最后一个’/‘字符及其左边的内容,返回从左边算起的最后一个’/’(不含该字符)的右边的内容。使用例子及结果如下:
1 | var=dir1/dir2/file.txt |
从运行结果可以看到,使用该命令,可以提取出我们需要的文件名file.txt。
若使用时在shell程序文件中,可以使用变量来保存这个结果,再加以利用,如file=${var##*/}
${var##*.}
该命令的作用是去掉变量var从左边算起的最后一个’.‘字符及其左边的内容,返回从左边算起的最后一个’.’(不含该字符)的右边的内容。使用例子及结果如下:
1 | var=dir1/dir2/file.txt |
从运行结果可以看到,使用该命令,可以提取出我们需要的文件后缀。
如果文件的后缀不仅有一个,例如,file.tar.gz,命令${var##*.}
仅能提取最后一个后缀,而我想提取tar.gz时该怎么办?那么就要用下面所说的${var#*.}
命令了。
${var#*.}
该命令的作用是去掉变量var从左边算起的第一个’.‘字符及其左边的内容,返回从左边算起第一个’.’(不含该字符)的右边部分的内容。使用例子及结果如下:
1 | var=dir1/dir2/file.tar.gz |
从运行结果可以看到,使用该命令,可以提取出文件的多个后缀。
${var%/*}
该命令的使用是去掉变量var从右边算起的第一个’/‘字符及其右边的内容,返回从右边算起的第一个’/’(不含该字符)的左边的内容。使用例子及结果如下:
1 | var=dir1/dir2/file.txt |
从运行的结果可以看到,使用该命令,可以提取出我们需要的文件所在的目录
${var%%.*}
该命令的使用是去掉变量var从右边算起的最后一个’.‘字符及其右边的内容,返回从右边算起的最后一个’.’(不含该字符)的左边的内容。使用例子及结果如下:
1 | var=dir1/dir2/file.txt |
当我们需要建立一个与文件名相同名字(没有后缀)的目录与对应的文件相对应时,就可以使用该命令来进行操作。例如,解压文件的情况就与此类似,我们压缩文件file.zip时,会在与file.zip同级目录下建立一个名为file的目录。
- 总结
其实${}并不是专门为提取文件名或目录名的,它的使用是变量的提取和替换等等操作,它可以提取非常多的内容,并不一定是上面五个例子中的’/‘或’.’。也就是说,上面的使用方法只是它使用的一个特例。
看到上面的这些命令,可能会让人感到非常难以理解和记忆,其实不然,它们都是有规律的。
-
#:表示从左边算起第一个
-
%:表示从右边算起第一个
-
##:表示从左边算起最后一个
-
%%:表示从右边算起最后一个
换句话来说,#总是表示左边算起,%总是表示右边算起。
*:表示要删除的内容,对于#和##的情况,它位于指定的字符(例子中的’/‘和’.’)的左边,表于删除指定字符及其左边的内容;对于%和%%的情况,它位于指定的字符(例子中的’/‘和’.’)的右边,表示删除指定字符及其右边的内容。这里的’'的位置不能互换,即不能把号放在#或##的右边,反之亦然。
例如:${var%%x*}
表示找出从右边算起最后一个字符x,并删除字符x及其右边的字符。
看到这里,就可以知道,其实该命令的用途非常广泛,上面只是指针文件名和目录名的命名特性来进行提取的一些特例而已。
basename和dirname
${}
并不是专门为提取文件名和目录名设计的命令,那么basename
和dirname
命令就是专门为做这一件事而已准备的了。
basename
该命令的作用是从路径中提取出文件名,使用方法为basename NAME [SUFFIX]。
1.1 从路径中提出出文件名(带后缀),例子如下:
1.2 从上面命令的用法中可以看到,后缀(SUFFIX)是一个可选项。所以,若只想提取出文件名file,而不带有后缀,还可以在变量的后面加上后缀名,例子如下:
dirname
该命令的作用是从路径中提取出目录名,使用方法为 dirname NAME。使用例子如下:
这样就提取出了file.txt文件所在的目录。
注:该命令不仅能提取出普通文件所的目录,它能提取出任何文件所在的目录,例如目录所在的目录,如下:
它提取出了目录dir2所在的目录dir1.
查看硬盘剩余空间
1 | # 整个硬盘空间 |
查看 package 版本
1 | apt-cache show packagename |
Windwos 下的脚本
windows 下显示环境变量
echo %http_proxy%
windows 下设置代理服务器
$$
$$
1 | set http_proxy=http://username:pwd$$$@proxy-rzf:8080 |