Scripts

Batch

http://www.bathome.net/
隐藏CMD运行窗口

特殊符号

symbolfunction
.在一般命令中当作空格, 在echo命令中当作空行
^字符画某个符号,如: echo ^>
&组合命令,前后没有因果关系;只是为了写在一行; 注意:左侧不要有空格(会被左侧理解成1个字符),右侧空格无所谓!
&&短路特性.前一个执行成功,才执行后面
||前一个执行失败,才执行后面的命令; |表管道
1>nul将语句产生的输出信息屏蔽(或>nul);
2>nul将语句产生的错误信息屏蔽

基本变量

cmd自上而下、逐条处理批处理语句,注意:以下算作1条语句: for if else & || && | ()
这很类似于宏展开,需要延后这种行为?: setlocal EnableDelayedExpansion

更多

cron, at

  • crontab -e: 无需用户列,普通用户
  • /var/log/cron: 运行日志
  • /etc/crontab: 只有root允许编辑(多了一个用户列);
    编辑后不需要重启!
  • /var/spool/cron/username: 其他用户
# 如分钟填2,表示一小时的第2分钟;
# 单独的'*'表示每一个最小的精度如:每分钟、每周几... 如果是每分钟都填星号

# 分钟  小时 天  月    星期  USER  命令/脚本
#  0    18   *  1-3   2,5  root   NULL :1-3月份,每个星期2,5的下午6点
#  */2  0-2  *  9-12  1-5  root   sh   :9-12月份,周1-周5,0:00到2:00点,每隔两分钟,执行脚本sh
#		2W: 这个月2号的最近工作日,若2号是周六则实际为4号.不能跨月! LW:表示这个月最后一周的工作日!
#		L:  一个月的最后一天
#					6L:  一个月的最后一个星期五;不加表示周六:7!
#					7#3: 本月第3周的周六

at

指定在某个时间点做某事

更多

Shell

编译为可执行文件?

CFLAGS+=-static shc -r -f script.sh  # 生成script.sh.x二进制文件

basic

-x: 显示脚本执行的顺序
-n: 不运行,只检查语法

更多

Regex

https://regexr.com/
http://tool.chinaz.com/regex/
https://github.com/google/re2/wiki/Syntax

Regular Expression

  • 默认每个子表达式会自动拥有一个组号,\0表示表达式本身
  • 零宽断言语法中所用到的前缀或后缀的修饰括号不算做一个子表达式
  • 注意:ERE取消了向前引用子表达式功能. 如果还要高级应使用ARE

BRE

. * ^ $ [^]: 注意^的2种含义
\(\): 子表达式,\2表第2个字表达式即向前引用字表达式
\{\}: 匹配次数
\b: 匹配单词的开头或结尾;或使用\<\>
\w: 匹配A-Za-z0-9_

更多

Bash

shortcuts

  0   # 标准输入,如: 0>, 0>> (数字零可不写)
  1   # 标准输出,如: <, 1< (数字1可以不写))
  2   # 标准错误输出, 如:2>&1表stderr重定向到stdout
  !!  # 上一条命令
  !$  # 上一条命令的参数
  shift + PgUp  # 滚屏
  ctrl + +   # 放大(+-缩小,+0原始大小)
  ctrl + p   # 显示上一条命令(或方向键)
  ctrl + n   # 显示下一条命令
  ctrl + r   # 输入关键字以搜索历史命令,没有继续按ctrl+r!
  ctrl + c   # 放弃当前行命令,开启新行;或终止当前前台运行的程序!
  ctrl + z   # 挂起当前前台运行的程序! 一般会配合 bg 使其后台运行
  ctrl + d   # Delete,无可删时退出当前会话!

  ctrl + a   # 光标移动到行首
  ctrl + e   # 光标移动到行尾
  ctrl + f   # 光标向前移动一个字符
  ctrl + b   # 光标向后移动一个字符
  ctrl + h   # Backspace
  ctrl + u   # 删除光标左边所有字符
  ctrl + k   # 删除光标右边所有字符
  ctrl + w   # 删除到单词的开头(不包括当前单词)
  ctrl + y   # 粘贴刚才所删除的单词
  ctrl + /   # Undo(C-d删除的不算!)
  ctrl + v   # 转义键,比如输入该组合后再按TAB就是TAB的ASCII表示!
  ctrl + i   # 相当于TAB,ctrl+m:相当于回车!
  Alt  + .   # 上条命令的最后一个参数, M-0-. :第1个参数

  ctrl + PgUp          # 前一个标签  ctrl + shift + T 新建标签(ctrl+shift+W关闭)
  ctrl + shift + PgUp  # 当前标签左移
  ctrl + shift + Q     # 关闭终端
  ctrl + shift + N     # 新建终端
  ctrl + shift + C     # 复制, 粘贴:ctrl+shift+v
  ctrl + x + u         # 撤销(先按ctrl+x松开x继续按u)

common cmd

  su - lei  # 将用户切换为lei,也带上其环境变量
  env       # 显示所有的环境变量; ; source ~/.bashrc :立即生效
  date +%F  # 如:2014-04-09
  yes xxxx  # 不停的输出字符串
  printf '\e[31m%s\e[m \e[1;33m%d\e[m\n' "Hello" 34
# col [-bfpx] [-l num]  :b(过滤掉控制字符^H,常用!) x(空格表TAB) l(缓冲列数,很少用)
# 改变当前用户的shell,修改了/etc/passwd!-l:显示系统所有shell:/etc/shells!
  chsh -s $(which zsh)

  man 5  # 配置文件的帮助; 1:命令的帮助(默认) 2:系统函数 3:C库函数
  write USER < file  # 给已登录的用户leiz发送信息,信息内容在文件file中
  wall  MSG  < file  # 给所有已登录的用户发送信息或文件内容

# ls
  # -A: 类似-a,但.及..不会列出! .. | grep '^\.' 只显示隐藏文件
  # -R: 递归查看子目录
  # -S: sort by file size.  -r:倒序  -t:以时间排序
  # -F: 把目录都加上'/',软连接'@',可执行'*',套接字'=',FIFO'|'
  ls -lhF | grep *$  # 列出当前目录所有可执行文件,-h:human-size.
  ls -d */ # 列出当前目录下所有一级子目录
  ls -dl   # 列出当前目录属性
  ls {a?,b*,1..5}  # 表示a开头的2字符的文件+b开头的文件+文件名为1、2、3、4、5
  alias l.='ls -d .*'  # 只显示隐藏文件

# file
  mkdir -pm 777 /t/{2,3}  # 创建目录包括父目录并且制定目录的权限,1/下有两个文件夹2,3
  touch {1..3}.txt   # 创建文件1.txt,2.txt,3.txt
  ln -s /usr/d ../g  # 当前目录的上层目录创建一个文件名为g的软连接-->/usr/d(注意:源位置一定要是绝对路径!)
  rm  -rfv tmp test  # 递归删除tmp文件夹以及test文件(v:显示信息).注意指定的文件不能过多<=20.删除目录也可以 'rmdir -p'
  # cp和mv都不支持创建到目标位置的中间路径!如果目标目录(或文件名)不存在则会重命名源文件夹(或源文件名)到目标!
  # 如果cp或mv多个源,则目标必须是已存在的目录,否则命令失败!
  \cp -rpf t1 t2 /t  # 将t1+t2文件/文件夹及其属性全部cp到/t目录,需要有x权限. \cp指示不要使用alias; -f强制覆盖!
  mv  -f t1 t2 /tmp  # 此时目标/tmp必须是个目录.

# tree
  # -d:仅显示目录  -C:加上彩色  -t:用更新时间排序  -F:同ls的-F
  # -sh:显示大小  -p:显示权限  -L:后面跟数字,显示的层数
  tree -CDtsh .

  # date cal dc
  file f     # 查看文件的类型
  head -8    # 显示到倒数第9行,默认前10行.-n可省略,-c:按字符.类比tail.
  tail -F x  # 可以连续实时追踪文件变换,当目标是个软连接时,即使其被改变了也会自动重定向到新的文件
  od -t c f  # 以ASCII查看文件f, -d:十进制, -x:十六进制
  type cmd   # 查看命令是否是内建的
  history 3  # 查看最近3个命令
  umask -S   # 查看默认的文件访问属性
  wc -l      # 查看文件file有多少行) -c(多少个单词) -m(多少字节)
  locate f   # 简单的查找一个文件,updatedb:更新数据库以便新文件可以被查找到
  which gcc  # 可行文件gcc的路径
  whereis z  # 查找系统文件的位置

# cat & stat
  # %A: Access rights in human readable form
  # %T: type in human readable form
  # %F: file type
  # %G: group ID of owner
  # %u: user ID of owner
  # %u: user name of owner
  # %i: inode number
  # %n: name of the file
  # %s: total size in bytes
  # %x: time of last access
  # %y: time of last modification
  # %z: time of last change
  stat -c "%s %n" file :只显示出file的大小和名字
  cat -b f1 f2 >> f3 # 两个档案的纯内容加上行号追加到f3. -n:加上编号,-b:空白行不编号,-s:--squeeze-blank,连续的空白行压缩为1行.
  cat /dev/null > f  # 清空文件
  cat >> file        # 从键盘输入追加到文件,C-d结束输入;如下可以指定特殊字符结束输入.
  # cat > file << EOF  # EOF结束输入(必须独占1行且不含任何空格!),也可以把'<< EOF'写到cat后面

# jq
  # 格式必须标准,key必须使用双引号,最后一个item不能有逗号
  # -r   :如果过滤的结果是字符串则显示时去掉双引号,raw-output
  # .foo :大小写敏感,包含该子串的所有属性
  # .[1] :访问数组的第2个元素
  # .{name:.arr[1].name} :访问对象arr数组的第2个元素的name属性,映射名为name
  jq ".[]" a.json
  cat a.json | jq .
# cloc
  # --by-file :也列出目录中每个文件的行数
  cloc --exclude-dir=.git .  # 统计代码量

Permission

  文件类型权限 硬连接数 所有者 所属组 文件大小(不准确) 最后修改时间  名称
  drwxr-xr-x  2       root   root  4096            12-01 20:52  bin

  示例权限:  0421: sticky位, 4(read) 2(write) 1(execute)
  目录权限x: 该目录可以被cd(子目录不一定),该权限是其他权限操作的基础(以下权限都隐含本权限)!
  目录权限w: 该目录下可以touch、mv、rm自己创建文件;要递归mv、rm子文件夹,子文件夹也必须具有wx权限!
  目录权限r: 该目录可以被ls,若无x权限则ls -l只能列出文件名,不能正常显示文件属性信息!
  目录权限t: 粘着位sticky:o+t.用于约束具有777权限的目录,使用户不能删除该目录下不属于自己的文件. 1755
  可执行文件权限u+s: 普通用户在执行该文件时,临时以root身份来执行该文件!普通文件具有s权限没有什么意义! 4755
  可执行文件权限g+s: 普通用户在执行该文件时,临时以root组身份来执行该文件!如touch时,该文件的所属人会变为root. 2755

chmod

  • 注意: chmod如果只写目录的话仅对目录有效,要想对旗下所有生效除非有-R选项或使用*通配符.
  • 注意: chmod -R +w-R -w这种写法可能存在bug,不能如预期执行,请使用完整语法: -R a+w!
  • 注意: 改变文件的属主,会清除suidguid位!
setuid; setgid; sticky;  # 4 2 1, u+s g+s o+t, 这个属性放在数字权限的最开头,如1777表示:o+t

# 可用于目录或文件!只有属主或root可以对tmp执行rm、mv,即使其他人有w权限!
# -rwx--x--t,这表示others具有x权限,另外该文件具有sticky位!
sticky
# 只对文件有效!表任何可以运行此文件的用户将具有该文件属主一样的权限去运行该文件!
# -rws--x--x,若owner不具有x权限,则用大写S代替!
setuid
# 只对目录有效!表任何复制到此目录的对象将具有与此目录相同的所属组,除非复制时用-p参数!
# drwx--S--x,大写表示group不具有x权限,另外该目录具有setgid位!
setgid

# immutable:保护文件不被(包括root)删除、改名、链接、写入;目录则不可创建+删除文件; -i:是移除该属性,防止root删除不了!
chatrr +i test

# 递归(本身+所有子目录和文件)改变文件夹t的拥有者及所在群组为owner_name
chown -R owner_name:group_name t
# 递归改变文件或文件夹file的所属群组
chgrp -R group_name file
# user+group拥有rx,others拥有x,所有用户去除w;所有时可不写出a但w比较变态,见上头注释!
chmod ug+rx,o=x,a-w tmp

tar

默认解压目标文件到当前目录!

更多

Grep

http://man.linuxde.net/grep

支持BRE+ERE(-E)

常用通配符: [! - , ? *]

更多

Find

find [options] [expressions] 2>/dev/null

  # -nouser(无属主) -nogroup(无属组)
  # -o: 逻辑或 \( expr \) -or \( expr \)
  # -a: 等价于 expr expr
  # -not: 等价于 !\( expr \)
  # -iname: 可以使用通配符(\转义).简单的名称(无通配符的)无需加引号!
  # -type:  l表示链接, d:目录, f:文件; -type d -empty :空目录
  # -size:  如'-size +10M': 表示大于10M的文件.c:字节,k:千字节,G:吉字节
  # -mmin:  如'-mmin -120': 表示2个小时内被modify过的文件. -amin:access, -cmin:change, -mtime:以天计
  # -perm:  如'-perm -4000': 表示具有setuid权限的文件
  # -user:  如'-user lei': 属用户leiz的所有文件, -uid:文件所有用户的uid, -gid:文件所属组的组id, -group:文件所属组
  # -maxdepth: 最大深度,1表示仅进入一层目录.
  # -iregex: 如使用扩展的regex,不区分大小写: find -regextype posix-extended -iregex pattern
  # -delete: 查找到后删除(若是'-type d'则仅能删除空目录)!注意,放在命令的最后,且不能与-prune一起使用!

搜索时排除某几个目录;

注意:-path后面的路径其最后不要加/!

更多

Sed

Stream Editor

sed会逐行读取数据到模式空间处理,之相对保持空间用来临时倒腾.

更多

exec, xargs

  • find会把找到所有的item(大括号表示)一次性传递给exec,执行命令cmd,注意必须要对分号转义;
  • 注意: 如果传递给exec的参数过多,在运行一段时间后就会出现参数溢出错误.
  • 在有的系统中会为每一个匹配到的文件发起一个进程,显然这回严重影响系统效率!
  # 递归查找当前目录下的最大文件
  find . -type f -exec stat -c "%s %n" {} \; | sort -nr | head 1
  # 备份每一个.sh文件,可能会为每一个cmd都启动一个新进程.
  find . -name "*.sh" -exec cp {} {}.old \;

xargs

一次只处理一部分文件而不是全部(默认是1个),系统只会启动一个进程!

更多

Registry

  • 需要添加的"路径、键值名称、键值数据"如果有空格需使用双引号!
  • 可用reg import导入已有的.reg文件
  • 所有的"命令、注册表路径、键值名称、键值类型"均不分大小写!
  • 注册表路径必须使用反斜杠!
  • reg_expand_sz中要使用如下形式: %%systemroot%%
  • &B: 字符串的值时表示这个字母加下划线,为默认快捷键

demos

rem /f  :强制不提示出错; /t:默认就是reg_sz,可以不指定
rem /ve :指定默认键值'/ve /d data',e代表empty!也可以配合delete删除默认键
rem /va :配合delete,delete all the values under this key
reg add | delete <注册表路径> /v <键值名称> /t <键值类型> /d <键值数据> /f

rem 打开列表添加vim
reg add hkcu\Software\Classes\Applications\gvim.exe\shell\open\command /f /ve /d "d:\usr\Vim\gvim.exe --remote-silent %1" >nul

rem autorun
reg add hkcu\Software\Microsoft\Windows\CurrentVersion\Run /f /v Launchy /t reg_sz /d "%~dp0%\LaunchyPortable.exe" >nul

rem misc
reg add hkcu\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced /v "Hidden" /t reg_dword /d 0 /f
reg add hkcu\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced /v "Hidden" /t reg_dword /d 1 /f
reg query keyname [/v valuename | /ve defaultname] [/s everySubItem]
reg query "hklm\SYSTEM\ControlSet002\Control\Session Manager\Environment" /v path | find "D:\Program Files\bin"

taskbar

  • 这几个键值必须kill掉explorer然后import才能生效(因为他们都是开机读取关机写入)
  • 主要由该键值的第9个字节的个个bit控制,主要控制任务栏的方向、自动隐藏等属性
    HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\StuckRects2 28000000ffffffff02000000000000003e0000003000000000000000000000003e00000000030000
  • 该键值主要控制任务栏上’Quick Launch’是否显示
    HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Streams\Desktop\TaskbarWinXP
  • 该键值主要控制任务栏上已经被锁定的图标
    HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Taskband

更多