欢迎访问我的博客,你的支持,是我最大的动力!

Linux Shell文本处理常用命令

Linux 马从东 147℃ 评论
目录:
[显示]
find 文件查找
# 查找多种类型 注意括号要转义 括号左右有空格
find . \( -name "*.yml" -o -name "*.json" \) -print
# 使用正则 .*(.yml|.json)$
find . -regex ".*\(\.yml\|\.json\)$"
find . -iregex ".*\(\.yml\|\.json\)$" # 忽略大小写的正则 -i
# 使用条件
find . ! -name "*.yml"
# 查找深度为1的所有文件 f 文件
find . -maxdepth 1 -type f
find . -type d # d 目录 l 符号链接
# 按时间查找
-atime 访问时间 单位天 -amin 单位分钟 ls -ltu
-mtime 修改时间 内容发生改动 ls -lt
-ctime 变化时间 元数据或权限变化 ls -lc
查看文件的三个时间
stat filename
find . -amin -10 -type f # 10分钟内被访问过的文件
find . -amin +10 -type f # 10分钟前被访问过的文件
# 按大小 k M G
find . -type f -size +2M # 大小超过2M的文件
# 按权限查找
find . -type f -perm 755
# 按用户查找
find . -type f -user root
## 找到后继续后续处理
# 查找并删除 注意 包括子目录内的文件
find . -name *.ini -delete
# 注意结构 -exec ... {} \; {}为占位符 替代前面查找出来的内容
find . -user root -exec chown test {} \; #修改属性对软链接无效
grep 文本搜索
# ll -Shr #-S 按文件大小排序降序 -r 升序
-v 没有匹配的
-c 统计次数
-n 打印行号
-i 忽略大小写
-l 只打印文件名
-R 递归
# 递归搜索
grep "jinja" . -R -n #可用于查找代码
# 匹配多个模式
grep -e "copyright" -e "without" simplified_bsd.txt
xargs 命令行参数转换
# 将多行合并为一行
cat requirements.txt | xargs
# 将单行转换为多行
cat requirements.txt | xargs -n 3 # 每3个字段为一行
-I {} 指定替换字符串 这里的{}可以在后面的命令中当作占位符使用
# 查找当前目录下所有文件并删除
find . -type f | xargs -I {} rm {}
# 查看当前目录下所有内容 并统计行数
find . | xargs wc -l
# 查看 / 目录下以.conf结尾文件并进行文件分类
find / -name *.conf -type f -print | xargs file
sort 排序
-n 按数字排序
-d 按字典排序
-r 逆序
-k num 按第num列排序
-b 忽略空格等前导空白字符
# 按第二列升序
sort -k 2 a.txt
# 找出内存使用量较高的进程
ps -aux | sort -rnk 4 | head -20     #第4列为内存百度比
# CPU最高的进程
ps -aux | sort -rnk 3 | head -20     #第3列为CPU百分比
uniq 消除重复行
# 消除重复行
sort a.txt | uniq
# 统计各行在文件中出现次数
sort a.txt | uniq -c
# 显示重复行
sort a.txt | uniq -d
tr 字符替换
注意只能一个字符替换一个字符 不能一个字符替换一个单词
echo 12345 | tr '0-9' '9876543210'
echo 12345 | tr 1 a #将1替换为a
# 删除字符
echo 12345 | tr -d '4' #删除字符4
# 将小写替换为大写
cat requirements.txt | tr '[:lower:]' '[:upper:]'
cut 按列切分文本
-b 以字节为单位 -c 以字符为单位 -f 以字段为单位
-d 指定定界符
范围计算
3- 第3个字段至末尾
-3 第1个到第3个字段
3-4 第3到第4个字段
# 获取第4列字符
cut -c 4 a.txt
# 获取前4列字符
cut -c -4 a.txt
# 获取第3到第4列字符
cut -c 3-4 a.txt
cut -f 3-4 -d" " a.txt
cut -f2 -d" " a.txt
paste 按列接接文本
# 拼接两个文件 默认定界符是制表符
paste a.txt a.txt
# 指定定界符为;
paste a.txt a.txt -d";"
wc 统计行和字符
wc -l a.txt #统计行数
wc -w a.txt #统计单词数
wc -c a.txt #统计字符数
sed 文本替换
sed通常用单引号来引用;也可使用双引号,使用双引号后,双引号会对表达式求值
即使用变量 $abc
# 首处替换
seg 's/text/replace_text/' file
# 全局替换
seg 's/text/replace_text/g' file
# 直接修改原文件
seg -i 's/text/replace_text/g' file
# 移除空白行
sed '/^$/d' requirements.txt
# &引用
sed 's/^.\{3\}/&\//g' requirements.txt
^.{3} -> &/ #&替代前面匹配到的内容 在前三个字符后添加/
awk 流处理
awk 'BEGIN{ statements } statements2 END{ statements }'
a.执行begin中语句块
b.从文件或stdin中读入一行 执行statements2,复制该过程直到全部读取完
c.执行end语句块
echo -e "line1\nline2" | awk 'BEGIN{print "start"} {print } END{ print "End" }
特殊变量:
NR:表示记录数量,在执行过程中对应当前行号;
NF:表示字段数量,在执行过程总对应当前行的字段数;
$0:这个变量包含执行过程中当前行的文本内容;
$1:第一个字段的文本内容;
$2:第二个字段的文本内容;
cat requirements.txt | awk '{ print NR,NF,$2 }'
awk '{ print NR,NF,$2 }' requirements.txt
awk '{ print NR,NF,"=",$2 }' requirements.txt
echo -e "1\n 2\n 3\n 4\n" | awk 'BEGIN{num = 0 ;print "begin";} {sum += $1;} END {print "=="; print sum }'
-F 来设置定界符 默认为空格
awk -F: '{print $NF}' /etc/passwd
getline 将外部shell命令的输出读入到变量cmdout中
echo | awk '{"grep root /etc/passwd" | getline cmdout; print cmdout }'
# 打印前10行
awk 'NR<=10{print}' requirements.txt
# 打印后10行
awk '{buffer[NR%10] = $0;} END{for(i=0;i<11;i++){print buffer[i%10]}}' requirements.txt
# 打印指定列
ls -lrt | awk '{print $6}'
# 打印处于两匹配之前的文本
awk '/jinja2/,/paramiko/' requirements.txt
# ping时打印时间
ping www.baidu.com | awk '{ print $0"\t" strftime("%Y-%m-%d %H:%M:%S",systime()) }'
PING www.baidu.com (180.97.33.108) 56(84) bytes of data. 2019-03-21 17:24:52
64 bytes from sp2.baidu.com (180.97.33.108): icmp_seq=1 ttl=55 time=31.7 ms 2019-03-21 17:24:52
ag 比grep ack更快的递归搜索文件内容
项目:https://github.com/ggreer/the_silver_searcher
yum install https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/Packages/t/the_silver_searcher-2.1.0-1.el7.x86_64.rpm
格式:
ag [FILE-TYPE] [OPTIONS] PATTERN [PATH]
-g 仅打印文件名
-o 仅打印匹配的行
-a 搜索所有文件(不包括隐藏文件和忽略的文件)
-f 跟踪软链接
-i 忽略大小写
-t 搜索所有文本文件
-w 只匹配整个单词
-z 搜索gzip文件
用法:
# 列所有支持的文件
ag --list-file-types
## --css .css / --go .go / --html .htm .html .shtml .xhtml / --ini .ini / --json .json / --log .log / --php .php .phpt .php3 .php4 .php5 .phtml
## --shell .sh .bash .csh .tcsh .ksh .zsh .fish / --sql .sql
# 搜索ansible目录下内容包括php-admin的文件
ag php-fpm ansible   #ag -C php-fpm ansible  显示前后两行上下文
ansible/a.yml
19: - name: restart php-fpm
20: service: name=php-fpm state=restarted
25: - name: 引用restart php-fpm
mycli 支持自动补全和语法高亮的mysql客户端
项目:https://github.com/dbcli/mycli
# 支持python 2.7 和 3.4+

安装
pip install mycli
pip install --ignore-installed mycli    #安装过程中忽略已安装的包
## 会安装依赖包:click, Pygments, six, configobj, enum34, asn1crypto, pycparser, cffi, cryptography, sqlparse, PyMySQL, terminaltables, wcwidth, tabulate, backports.csv, cli-helpers, prompt-toolkit, mycli
jq json文件处理及格式化显示
项目:https://github.com/stedolan/jq
安装

yum install https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/Packages/o/oniguruma-5.9.5-3.el7.x86_64.rpm
yum install https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/Packages/j/jq-1.5-1.el7.x86_64.rpm
使用
echo '{"uid":100120,"token":"1fa9fb8004b04f66b7da57393641eddc"}' | jq .
{
"uid": 100120,
"token": "1fa9fb8004b04f66b7da57393641eddc"
}
cat abc.json | jq .
cat abc.json | jq . > abc格式化.json
# curl返回的数据 json 格式化
result=$(curl http://xxxxx)
echo $result | jq .

 

 

 

转载请注明:轻风博客 » Linux Shell文本处理常用命令

喜欢 (0)or分享 (0)