awk,说shell中的瑞士军刀不为过吧
# 实现SQL中的group by功能,例如对“姓名 地点 年龄”按照地点字段统计其年龄之和
awk '{arr[$2]+=$3} END{for(i in arr) print i,arr[i]}' source_file.txt
# 对下述数据peo.o,按照城市分组(组内年龄降序排序),并使得全局分组的排序以组内年龄最大值降序排序
# 姓名 城市 年龄
# 老Q 上海 65
# 老K 南京 68
# 小A 上海 24
# 小M 西安 25
# 老M 西安 88
# 老A 南京 45
# 期望结果
# 姓名 城市 年龄
# 老M 西安 88(组与组之间最大)
# 小M 西安 25(组内降序)
# 老K 南京 68
# 老A 南京 45
# 老Q 上海 65
# 小A 上海 24
sort -t $'\t' -k 3nr peo.o > peo_sort.o # 预处理,对年龄全局降序排序
awk 'NR==FNR{if(arr[$2]=="") arr[$2]=$3} NR>FNR{print $0,"\t",arr[$2]} ' peo_sort.o peo_sort.o | sort -t $'\t' -k 4nr -k 3nr | cut -f 1-3 > peo_rs.o
# awk中第一次遍历文档得到同城年龄最大值集合,第二次重新输出文件,其中每行新添一字段用以标注其所在组的最大年龄,sort中对新添字段排序,这时结果将按照组内年龄最大值分组降序排序,cut中截取原文档字段进行输出。
# 待续
sort,对文档数据进行排序
# 对txt.o第三列(以tab符分割)按照数值降序排序,输出到sort.o文件中
sort -t $'\t' -r -n -k 3 txt.o > sort.o
# 对txt.o第三列(以冒号分割)按照数值降序,第一列数值升序,第二列字符降序排列
sort -t $':' -k 3nr -k 1n -k 2r txt.o > sort.o
# 精确地对某个域进行排序(-k 2n可能是对从第二个域到最后的范围进行排序)
sort -t $'\t' -k1,1 -k7,7nr txt.o > sort.o #(对第一个域1,1和第7个域7,7nr进行排序)
-r # 默认为升序,该参数将其改为降序排序
-t # 按照后面指定的字符进行行切分,例如要按照tab符分割,则用$'\t'
-k # 指定按照切分后的某列(字段)进行排序,首列为1
-n # 将设置以数值进行排序,不然10会在2前面
-o # sort默认将结果输出至标准输出,重定向>则将结果写入新文件,若重定向到原文件,则会清空原文件;该参数可将结果写入原文件,如 sort -r number.txt -o number.txt
-u # 排序时去除重复的行
-f # 忽略大小写(将小写字母都转换为大写字母来进行比较)
-c # 检查文件是否已排好序,如果乱序,则输出第一个乱序的行的相关信息,最后返回1
-C # 检查文件是否已排好序,如果乱序,不输出内容,仅返回1
-M # 会以月份来排序,比如JAN小于FEB等
-b # 忽略每一行前面的所有空白部分,从第一个可见字符开始比较
参考和补充(例如以第二个字段第二个字符排序之类):Linux Shell之sort命令
df,显示目前所有档案系统的最大可用空间及使用情形
# 常用命令,以易读格式显示文件系统使用情况
df -h
-a # 显示全部的档案系统和各分割区的磁盘使用情形
-i # 显示i -nodes的使用量
-h # 显示使用「Human-readable」的输出(GB、MB 等易读的格式)
-k # 大小用k来表示 (默认值)
-m # 大小用M表示
-t # 显示某一个档案系统的所有分割区磁盘使用量
-x # 显示不是某一个档案系统的所有分割区磁盘使用量
-T # 显示每个分割区所属的档案系统名称
du,查询档案或目录的磁盘使用空间
# 常用命令,以易读格式显示文件的磁盘使用空间,最后附上总计
du -ch
-a # 显示全部目录和其次目录下的每个档案所占的磁盘空间
-b # 大小用bytes来表示 (默认值为k bytes)
-c # 最后再加上总计 (默认值)
-h # 显示使用「Human-readable」的输出(GB、MB 等易读的格式)
-s # 只显示各档案大小的总合 (summarize)
-x # 只计算同属同一个档案系统的档案
-L # 计算所有的档案大小
参考和补充:df命令和du命令用法详解
tar,对文件目录进行打包备份
# 将整个 /etc 目录下的文件全部打包成为 /tmp/etc.tar
tar -cvf /tmp/etc.tar /etc # 仅打包,不压缩!
tar -zcvf /tmp/etc.tar.gz /etc # 打包后,以 gzip 压缩
tar -jcvf /tmp/etc.tar.bz2 /etc # 打包后,以 bzip2 压缩
# 将 /tmp/etc.tar.gz 文件解压缩在 /usr/local/src 底下
cd /usr/local/src
tar -zxvf /tmp/etc.tar.gz
-c # 建立新的归档文件 (create )
-x # 从归档文件中解出文件
-r # 向归档文件末尾追加文件 注意 # 在参数的下达中,c/x/t 仅能存在一个。
-O # 将文件解开到标准输出
-v # 处理过程中输出相关信息
-f # 对普通文件操作
-z # 调用gzip来压缩归档文件,与x联用时调用gzip完成解压缩
-Z # 调用compress来压缩归档文件,与x联用时调用compress完成解压缩
参考和补充:tar命令的详细解
scp,主机之间拷贝文件
-a # 尽可能将档案状态、权限等资料都照原状予以复制
-r # 若 source 中含有目录名,则将目录下之档案亦皆依序拷贝至目的地
-f # 若目的地已经有相同档名的档案存在,则在复制前先予以删除再行复制
参考和补充:SCP 命令
cron,定时执行任务
crontab -l # 显示当前用户的cron服务
crontab -u # 为某用户设置cron服务(一般root用户在执行cron命令时需要此参数)
crontab -e # 编辑当前用户的cron服务(配合-u参数)
crontab -r # 删除当前用户的所有cron服务(配合-u参数)
/sbin/service crond start/stop/restart/reload # 启动/停止/重启/重新加载配置文件
# 单行为一个执行命令,前五个字段分别代表“分 时 日 月 周”,具体参看参考链接;
# 用户通过crontab -e设定的cron服务内容会被保存到/var/spool/cron/username文件中,在该文件被修改后,cron守护进程会重新读到内存;
# 在/etc/crontab文件中会有cron.hourly/cron.daily/cron.weekly/cron.monthly等内容,分别指定按时/日/周/月执行的内容文件;如果某cron服务需要根据调度来执行,而非按时/日/周/月执行,则可添加到/etc/cron.d目录中。
参考和补充:crontab 详解、crontab命令详解
grep,全局正则搜索(Global search Regular Expression(RE) and Print out the line)
grep myword -r * #在当前目录下面搜索所有含有myword的行
-n # 在匹配的行前面打印行号
-r # 递归搜索文件夹中目录及每个文件
-i # ignore-case,忽略大小写
-h # 打印时不显示文件名
-l # 只显示包含匹配模板的行的文件名清单(不同项目之间用换行符分割)
-v # 反检索,只显示不匹配的行
匹配tab符号:grep $'\t'
如果文章对你有用,请在收藏之余“顶/赞”一下以示鼓励吧 (/ω\)
来源:oschina
链接:https://my.oschina.net/u/551773/blog/283198