日常使用的Linux命令-批量处理文本篇

374 阅读2分钟

背景

在制作网站/迁移文件时, 通常会面临大批量静态文本处理的情况, 使用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])