【大数据】Spark优化经验&案例--数据倾斜 《Mysql必知必会》读书笔记 jar包名中自动添加git commit id PyCharm教学视频学习笔记 《SQL基础教程》简要总结 《设计师要懂心理学》读书笔记 MySQL与MariaDB学习笔记 WDT (Folly) 安装指南 -- CentOS 7 [solved]Page build failed(Jekyll) 数据包过滤及分析实例 tshark tcpdump Scala Tour 学习总结 “Docker容器和容器云”读书笔记(1) “Docker Practice”读书笔记 “图解基础设施设计模式”小结 “图解服务器端网络架构”小结 Python网络安全编程 数据包解析笔记 华为挑战赛(1) DDoS攻击防御与云服务 基于网络回溯分析技术的异常行为分析 “Linux程序设计”小结(进程间通信) C语言编程规范(华为软件精英挑战赛) 2017阿里在线编程题--单源最短路径问题 2017年阿里在线编程题-- 数串分组 Uinx/Linux上的帮助查询命令 你懂C,所以C++不在话下 一篇特别长的总结(C专家编程) 程序员面试金典--笔记(精华篇) C陷阱与缺陷--笔记 半小时搭建电子商务网站--opencart linux网络知识和工具(持续更新) 网卡参数查询及设置工具ethtool 高性能流量生成工具trafgen(DDoS模拟) Linux流量控制工具TC 流量控制工具TC详细说明 tcpdump过滤数据包,结果不对? Lecture 网络攻击与防御技术笔记 gotgit-git权威指南 高效使用MacOS所要知道的 shell内置字符串处理 配置ntp(知其所以然) 360黑客攻防技术分享会--记录 中毒U盘恢复--快捷键病毒 Tor--anonymity network介绍(PPT) IBM bluemix 再读《Linux Shell脚本攻略》 linux shell 学习摘记(9) linux shell 学习摘记(8) linux shell 学习摘记(7) linux shell 学习摘记(6) linux shell 学习摘记(5) linux shell 学习摘记(4) linux shell 学习摘记(3) linux shell 学习摘记(2) linux shell 学习摘记(1) firefox vim 插件 vimperator A Byte of Vim 笔记 windows注册表小知识 安全测试工具篇(开源&商业) 安全及性能测试工具(网站收集) 性能测试工具 屡试不爽的“3个”iPad使用技巧 Shell Shortcuts(和Tab键一样实用) vim--自动添加jekyll post信息头 vim 自动给文件添加头部信息 GitHub Tips (很实用,值得收藏) Linux路由、防火墙、NAT命令

linux shell 学习摘记(2)

2016年09月24日

《linux shell 脚本编程攻略 (第2版)》 第二章 “命令之乐” 笔记

主要命令: cat, script, scriptreplay, find -exec, xargs, tr, md5sum, sha1sum, md5dep, crypt, gpg, base64, opensslpasswd, sort, uniq, mktemp, split, csplit, ${URL%*.}, ${URL##*.}, rename, look, echo -e, grep -q, PIDARRAY+=("$!"), expect

  • -被作为stdin文本的文件名,如echo "hello" | cat - file.txt

  • cat -s file.txt 可压缩相邻的空白行; cat -T file.py 能将制表符标记成^|(对python等文件很有用); cat -n 显示行号(其也会为空白行添加行号,加-b可跳过空白符)

  • 录制并回放终端会话
    1. 开始录制会话script -t 2> timing.log -a output.session,录制完后键入exit退出,最后通过scriptreplay timing.log output.session回放
    2. timing.log 用来存在时序信息(-t参数表示将时序信息重定向到stderr) output.session 存储命令输出信息
  • find
    1. find . -name "*.txt"find . -iname "example*"忽略大小写
    2. find . \( -name "*.txt" -o -name "*.sh" \) 打印出所有的.txt和.sh文件
    3. find /home/swf -path "*/hello/*" 使用-path来匹配文件路径;find . -iregex ".*\(\.py\|\.sh\)$" 通过正则表达式来匹配.py和.sh文件,且忽略find . -iregex ".*\(\.py\|\.sh\)$"忽略大小写
    4. find . ! -name "*.txt" 否定查询
    5. find . -maxdepth 3 -mindepth 1 -name "f*" 基于目录深度的搜索
    6. find . -type d 查找目录(f/l/c/b/s/p),s表示套接字设备,p表示FIFO
    7. -atime -mtime -ctime 访问时间、文件内容修改时间、文件元数据修改时间(权限、所有权);-atime -7表示最近7天内,-atime 7恰好在七天前, -atime +7 超过七天, 如find . -type f -atime +7; 类似的有-amin -mmin -cmin(基于分钟的参数)
    8. -size +2k, -size 2k, -size -2k按文件大小(大于,等于,小于)
    9. 删除当前目录下的.swp文件,find . -type f -perm 644 -name "*.swp" -delete
    10. find . -name "*.c" -exec cat {} \; > all_c_files.txt find同命令结合
    11. find . \( -name ".git" -prune \) -o \( -type f -print \) 不包含在.git目录中的所有文件名(若前者为真则后者不执行)
  • xargs能把从stdin接收到的数据重新格式化,再将其作为参数提供给其他命令
    1. cat example.txt | xargs -d X -n 3 以X为定界符, 每行2个参数
    2. cat args.txt | xargs -n 1 ./cecho.sh, cat args.txt | xargs -I {} ./cecho.sh -p {} -l,其中{}会进行扩充
    3. 删除特定系列文件find . -type f -name "*.txt" -print0 | xargs -0 rm -rf"
    4. 统计每个文件的行数和总行数 find . -type -f -name "*.md" -print0 | xargs -0 wc -l
  • cat files.txt | ( while read arg; do cat $arg; done; )相当于cat files.txt | xargs -I {} cat {}

  • echo file.txt | tr 'a-zA-Z' 'n-za-mN-ZA-M'tr -d '0-9'删除指定集合中的字符, tr -d -c '0-9 \n'将不在集合中的所有字符删除, tr -s ‘ ‘`将连续空格压缩为一个空格
    1. 将文件中的数字叠加 cat sum.txt | echo $[ $( tr '\n' '+' ) 0]
    2. 支持字符类 tr [:lower:] [:upper:]
  • 加密和散列
    1. md5sum -c *.md5, sha1sum -c *.sha1 检查校验和
    2. 对目录进行校验 md5dep -rl . > dircetory.md5(-r 递归方式, -l 相对路径); find . -type f -print0 | xargs -0 md5sum >> directory.md
    3. crypt <input_file >output_file加密, crypt PASSPARSE -d <encryptedfile >outputfile解密;gpg -c filename加密,gpg filename.gpg解密; base64 -d file > outputfile
    4. shadow-like散列, salt –> opensslpasswd -1 -salt SALTSTRING PASSWORD(类似/etc/shadow)维基参考
  • sort -nrk 1 data.txt -nr表明按照数字,采用逆序排列(默认是按照字母表排序), -k 1表示按照第一列排序;sort -z data.txt | xargs -0; sort -bd unsorted.txt -b忽略文件中的前导空白行,-d表明用字典排序

  • uniq -u sorted.txt只显示第一行,-c统计各行出现的次数, -d 找出重复的行;sort data.txt | uniq -s 2 -w 2 -s指定可以跳过前2个字符;-w指定用于比较的最大字符数;uniq -z file.txt | xargs -o rm

  • mktemp -d, mktemp test.XXX根据模版创建临时文件,(保证至少有3个X)

  • split -b 10k data.file -d -a 4 splitfile -d 表示以数字为后缀, -a 表示后缀长度;-l可以通过行来进行切分。但split只能通过文件大小和行来进行切分

  • csplit server.log /SERVER/ -n 2 -s {*} -f server -b "%02d.log" ; rm server00.log 按日志文件中的某个单词或内容进行切割。
    1. /[REGEX]/表示文本样式,用来匹配某一行
    2. {*} 表示匹配重复的次数,中间数字若为*则表示匹配直到文件结尾
    3. -s静态模式, -n 分割后的文件名后缀的数字数, -f 分割后的文件名前缀, -b 指定后缀格式(同fprint)
  • 扩展名切分, %表示从右向左进行匹配,删除匹配的到的内容(非贪婪),%%同%但是贪婪匹配#表示从左向右匹配,删除匹配到的内容(非贪婪),##同#但是**贪婪匹配
[root@share codes]# URL="www.baidu.com"
[root@share codes]# echo ${URL%.*}
www.baidu
[root@share codes]# echo ${URL%%.*}
www
[root@share codes]# echo ${URL#*.}
baidu.com
[root@share codes]# echo ${URL##*.}
com
  • rename 's/ /_/g' * 将文件名中的空格替换成字符_rename 'y/A-Z/a-z/' *转换文件名的大小; find . -type f -name "*.mp3" -exec mv {} targetdir \; 移动mp3文件到特定的目录下;find . -type -f -exec rename 's/ /_/g' {} \;

  • [ -z $output ] 用于判断output是否为空

  • grep "^word" /usr/share/dict/words -q; look word列出默认字典中所有的单词, look word /home/wenfeng/test.txt列出文件中以word起头的所有单词

  • echo -e "\nhello\n" expect可实现交互式输入

  • 利用并行进程进行加速 $!最近一个后台程序的PID

#!/bin/bash
PIDARRAY=()
for file in File1.iso File2.sio;
do
    md5sum $file &
    PIDARRAY+=("$!")
done
wait ${PIDARRAY[@]} # 或者 wait ${PIDARRAY[*]}


知识共享许可协议
SWF's Hacking Dreamonephone 创作,采用 知识共享 署名-非商业性使用 4.0 国际 许可协议进行许可。
© 2011-2024. All rights reserved by onephone. Powerd by Jekyll.