背景
在制作网站/迁移文件时, 通常会面临大批量静态文本处理的情况, 使用Linux脚本(sed/awk/grep等)能有效提升工作效率, 本文包括了一些我日常用到的批量文本处理脚本, 如果有更好的写法也欢迎各位同学在评论中互动
批量处理文件-裁剪头部并合并
在导出一些数据csv时, 往往带有表头, 如果后续要进行批量处理, 希望将多个csv合并成一个, 需要做一些预处理
# 裁剪头部并验证
find . |grep csv |xargs sed '1d' |head
# 合并所有csv到output
find . |grep csv |xargs sed '1,2d' >output.csv
导出网站
下载目标网站到本地
wget -mpEk http://www.dushuwu.net/index.aspx
本地分析wget结果
分析网页中常用的meta头部
find . |grep html |head |xargs grep -E "<meta " | grep --ignore-case keyword|grep -oE 'content="(.+)?"'|awk -F\" '{print $2}' |awk NF
find . |grep html |head |xargs grep -E "<meta " | grep --ignore-case description|grep -oE 'content="(.+)?"'|awk -F\" '{print $2}' |awk NF
批量更改文件编码
将utf-8与gb2312/GBK的文件进行互转
find . |grep csv|head |xargs -I % sh -c 'iconv -f gb2312 -t UTF-8 -c % > %.txt'
注意, 处理文件不要过度依赖命令行, 有时候编辑器的批量替换比sed方便
删除头部
# 删除1~14行
sed '1,14d' r3.txt > r4.txt
TXT转表格
# ❌awk这个写法有问题 这个会截断数据, 带有空格的数据会有损失
# awk '{printf "%s,%s\n", $1, $2}' r4.txt > t1.csv
# ✅sed的这个可以
sed 's/ /,/' r4.txt > t1.csv
批量从文件中提取有效链接
grep -rEo "href=\"http.*?\"" . |grep -v micro |grep -v beian |grep -v "gov.cn" |uniq
文件计数
du -a |wc -l
去重关键字
基于第二列进行排序和去重
cat keywords.txt|sort -k 2 -u > k2.txt
打乱文本排序
sort -R x1.txt > x2.txt
复制目录结构
如果只想要一个当前的目录结构, 但是不想复制里面的文件, 可以使用这个命令来快速创建一份目录结构
find data -type d|xargs -I {} mkdir -p result_{}
启用简单server
python3 -m http.server
提取img/meta
find .|sed '1,2d' |head |xargs grep -Eo "<img.*?>"
find .|sed '1,2d' |head |xargs grep -Eo "<meta.*?>"
查看Python函数代码
import inspect
lines = inspect.getsource(foo)
print(lines)
删除空行
awk '{printf "%s", $0}' 文件名
cat 文件名 | tr -d '\n'
# 这个版本最好, 因为可以传递文件名
find . |grep .html |head |xargs -I ^ awk 'BEGIN{printf "<filename>%s</filename>","^"}{printf "%s", $0}' ^
删除script
perldoc.perl.org/perlrun#-p -n 接收pipe数据 -p 执行处理指令
perl -ne 's|<script.*?</script>||gms; print
提取正文
这里的只是一个简单粗暴的提取方式, 后续我会更新一个更好用的
grep -r "<article" . |awk -F: '{print $1}'
生成链接页面(附带过滤)
8为字数较小的文章, 没有价值
echo '<meta charset="utf-8" />' > index.html
du -a |awk '$1>8{printf "<a href='%s'>%s</a>\n", $2, $2}' >> index.html
批量提取图片
find . |grep html |xargs -I % grep -oE 'src=".*?"' % |sort -u > ../assets/result.txt
cat result.txt |grep -Eo '(http.*?)"' |sed 's/.$//' |sort -R > r2.txt
向文件头部插入内容
注意文件行数!! 这里只有行数为1时才能这么做
find . |grep .md|head -1 |xargs -I ^ awk '{printf "---\n---\n%s", $0 > "^" }' "^"
删除目录下所有的文件(不包含子目录)
# 注意不要写成 find + xargs的形式, 会漏掉文件名中带空格的文件
find . -type f -exec rm '{}' \;
处理图片名称后面带Get参数的情况
import os
g = os.walk(r"./assets/")
for path,dir_list,file_list in g:
for file_name in file_list:
if "?" not in file_name:
continue
print(path + file_name, path + file_name.split("?")[0])
os.rename(path + file_name, path + file_name.split("?")[0])