🗓️ 2023-11-25 🎖️ 快速上手 🗂️ 工具使用 🏷️ #linux #cmdline

常用 Linux 命令

find & fd

fd 默认是正则表达式状态,以及会忽略一些文件

diff

  1. diff file1 file2:比较文件的异同:怎么样改变第一个文件,可以把它变成第二个文件
    • < 表示左边 file1 独有的文件/行,>表示右边 file2 独有的文件/行,| 表示两边都有,但不一样
    • 2,4a2,4:数字是闭区间[2-4]行,需要add 才能跟 file2 一样,【add、 change、 delete】
  2. diff file1 file2 -y -W 100 | grep ">":并排显示不同之处,每排宽度 100
  3. -y并排显示: --suppress-common-lines仅显示不同的;--left-column相同的仅在左边显示
  4. -w忽略所有空格,-i忽略大小写,-I <str>忽略字符串,-b 忽略行尾空格,字符串中若干空格视为相等
  5. -C <num> 不同之处上下显示 num 行上下文
  6. -q仅显示是否相同
  7. -p可用于比较 C 程序
  8. -r递归比较子目录,-N独有的文件会显示"only in xxx"
  9. diff {dir1} {dir2} -Nrqy只显示文件夹中哪些文件不一样,不输出具体的文件

grep

sed

sed 命令的基本格式是sed [-ni][-e<script>][-f<script文件>][文本文件]

sed 命令中有一些动作:(sed 从 1 开始计算行)

# 在第二行上面插入一行 rowxxxyyyy
sed -i -e 2i\ rowxxxyyyy test.txt
sed '2,5c\ shuaikai'
# 在满足 pattern 模式的行下面插入一行
sed -i '/.*123.*/a 456' test.txt
# 可以用圆括号来进行正则表达式捕获,并用\+数字来进行引用。圆括号要进行转义
echo "Hello, World" | sed -n 's#.*,\s\(\w*\)#\1#p'

awk

awk 命令的基本格式是awk -F " " ' pattern { action } ' filename,即指定分隔符,然后单引号括起来的所有内容作为参数传递给 awk,其中前半部分是一个正则表达式/条件,后面具体执行的操作用大括号括起来

awk 处理文件是以为单位,对每一行执行操作;每一行通过分隔符划分为NF个部分

# 输出csv文件每行中长度超过5的字符串,不超过的用xxx代替
awk -F ',' 'NF%3==0 {for(i=1;i<=NF;i++) if(length($i)>5) print$i; else if print"xxx"}'
# 删除文件中行号是4的倍数的行
awk 'NR%4==0 {print NR}' file | xargs -I{} sed -i "{}d" file
# BAEGIN 和 END 的示意,中间的action才是真正要执行的命令
## 比如如果需要什么累加的东西,则可以在 END 块中输出出来
awk '[pattern] BAEGIN{print"我要开始了"} {action...} END{print"我结束了"}'

例子

例 1 用 awk 和 sed 迁移阿里云上的图片:

  1. 找到阿里云 oss 仓库,选择批量导出 url,导出后是一个.csv 文件,格式为 obj,url

  2. 找一个文件夹下载所有 url

    cat export_urls.csv | awk -F, '{print $2}' | xargs wget
    
  3. 把下载的这些文件上传到新的 oss 上,得到新的链接。这会导致原来的笔记里面的图片链接全部失效,因此要更改链接。链接的区别只在前面的 bucket 地址,后面的图片名是完全一样的。因此只需要找到所有的笔记文件,把其中图片 url 中前面的 bucket 链接改成新的连接前缀即可

  4. 此处用到的 fd 命令要先下载,即 fd-find。可以对文件夹进行递归正则查询。至此,就完成了对所有图片的迁移、更改链接操作。

    fd ".*\.md$" | xargs sed -i 's#https:\/\/xxx.xxx#https:\/\/yyy.yyy#g'