Linux 下使用 Shell 处理文本时最常用的命令

1.sort排序

  • 参数
    -f:忽略大小写;
    -b:忽略每行前面的空白部分;
    -n:以数值型进行排序,默认使用字符串排序;
    -r:反向排序;
    -u:删除重复行。就是 uniq 命令;
    -t:指定分隔符,默认分隔符是制表符;

2.uniq

  • 参数
    -c, --count //在每行前加上表示相应行目出现次数的前缀编号
    -d, --repeated //只输出重复的行
    -D, --all-repeated //只输出重复的行,不过有几行输出几行
    -f, --skip-fields=N //-f 忽略的段数,-f 1 忽略第一段
    -i, --ignore-case //不区分大小写
    -s, --skip-chars=N //根-f有点像,不过-s是忽略,后面多少个字符 -s 5就忽略后面5个字符
    -u, --unique //去除重复的后,全部显示出来,根mysql的distinct功能上有点像

3.seq
seq : 按顺序打印一些数字
基本用法: seq [选项] ...尾数
seq [选项] ...首数 尾数
seq [选项] ...首数 增量 尾数
例: seq 1 2 10 输出1~10之间的奇数
seq 2 2 10 输出1~10之间的偶数
seq 10 -2 1 输出10~1之间的偶数
4.RANDOM

5.wc
wc 统计行数、单词数、字节数
-l:统计行数
-c:统计字节数
-w:统计单词数
-m:统计字符数

6.cut
cut命令:提取文件内容中指定的字段(列)、字符内容。单词的默认分隔符为空格。
-b:按照字节切,utf-8编码中每个汉字占3个字节
-c:按照字符切 -d:指定分隔符
-f:指定以分隔符为分割的哪个字段
例:cut -d : -f 1,6 /etc/passwd
显示文件中以:分割的第1和第6列的内容
cut -d : -f 1,3-5 /etc/passwd�显示文件中以:分割的1,3,4,5列内容
cut -d : -f -3 /etc/passwd
显示文件中前三列内容
cut -d : -f 3- /etc/passwd
显示文件第三列到最后一列的内容
cut -c 1-3 /etc/passwd 取每行的前三个字符
echo ‘欢迎光临’ | cut -b 1-6 取前六个字节‘欢迎’

7.rev
rev命令将文件中的每行内容以字符为单位反序输出,即第一个字符最后输出,最后一个字符最先输出,依次类推。

8.awk利用索引合并文件

https://www.jianshu.com/p/63122e7fb79e

9.column 命令
作用:格式化列显示
参数:
-c 字符数 指定显示的列宽
-s“ 分隔符 “ 使用-t选项时,指定分隔符(允许指定多个分隔符)
-t 判断输入行的列数来创建一个表。分隔符是使用在-s中指定的字符。如果没有指定分隔符,默认是空格

# df -h | column -t
Filesystem               Size   Used  Avail  Use%  Mounted         on
devtmpfs                 3.9G   0     3.9G   0%    /dev
tmpfs                    3.9G   0     3.9G   0%    /dev/shm
tmpfs                    3.9G   12M   3.9G   1%    /run
tmpfs                    3.9G   0     3.9G   0%    /sys/fs/cgroup
/dev/mapper/centos-root  27G    6.0G  22G    22%   /
/dev/sda1                1014M  137M  878M   14%   /boot
tmpfs                    797M   0     797M   0%    /run/user/0

10.while read逐行读取多列

while read a b c 
do
 echo -e "姓名:$a\t身份证:$b\t手机号码:$c"
done<userName.txt

或者

cat userName.txt |while read a b c
do
echo -e "姓名:$a\t身份证:$b\t手机号码:$c"
done

11.for逐行读取多列

count=1
for a in `awk '{print $1}' userName.txt` 
do
  b=`awk 'NR=='$count'{print $2}' userName.txt`
  c=`awk 'NR=='$count'{print $3}' userName.txt`
  echo -e "姓名:$a\t身份证:$b\t手机号码:$c" 
  let count++
done

两种方法的区别可以借鉴:

https://www.jianshu.com/p/2ede30dcfc6f

重定向符号的使用:
&>: 重定向标准输出或错误输出至同一个文件(或者2>&1)

扩展使用:

https://mp.weixin.qq.com/s/ImH0gfse6BrXoiNJart3Wg

11.遍历文件每行每列
测试文件

cat >list.txt<<EOF
安琪拉  88
白起    99
老夫子  78
火舞    89
妲己    99
狄仁杰  76
典韦    67
韩信    87
刘邦    56
刘禅    76
鲁班    78
墨子    88
孙膑    83
孙尚香  83
孙悟空  94
项羽    83
亚瑟    92
周瑜    91
EOF

参考脚本:
test.sh

#!/bin/bash
i=0
for name in `cat list.txt|awk '{print $1}'`
do
    let i++
    grade=`awk 'NR=='$i'{print $2}' list.txt`
    echo -e "名字:$name \t 成绩:$grade"
done

执行脚本:

# sh test.sh
名字:安琪拉   成绩:88
名字:白起    成绩:99
名字:老夫子   成绩:78
名字:火舞    成绩:89
名字:妲己    成绩:99
名字:狄仁杰   成绩:76
名字:典韦    成绩:67
名字:韩信    成绩:87
名字:刘邦    成绩:56
名字:刘禅    成绩:76
名字:鲁班    成绩:78
名字:墨子    成绩:88
名字:孙膑    成绩:83
名字:孙尚香   成绩:83
名字:孙悟空   成绩:94
名字:项羽    成绩:83
名字:亚瑟    成绩:92
名字:周瑜    成绩:91
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容