打印彩色输出 echo -e "\033[1;31m abc \033[0m" \033等价于\e -e 表示开启转义模式 1;31 这两个数字代表了功能与他们排布顺序无关 \e[1;31m 表示打印文本为高亮度红色 \e[0m 表示将颜色重新置回 文本色:黑色=30 红色=31 绿色=32 黄色=33 蓝色=34 洋红=35 青色=36 白色=37 背景色:黑色=40 红色=41 绿色=42 黄色=43 蓝色=44 洋红=45 青色=46 白色=47 其他色:高亮=1 下划线=4 闪烁=5 反显=7 消隐=8(让内容不可见)
变量 HTTP_PROXY=127.0.0.1:8080; export HTTP_PROXY export命令用来设置环境变量 给变量赋值时,所赋的值不包含任何空白字符(例如空格),那么它就不需要使用引号进行引用,否则必须使用单引号或双引号。 给变量赋值使用单引号时,变量不会被扩展将依照原样显示 c=word;c='$c is word';echo $c; 输出为 $c is word c=word;c="$c is word";echo $c; 输出为 word is word z=1;unset z; 使用 unset 命令删除变量的赋值
数学运算 使用let进行算术操作 a=1;b=2;let result=a+b;echo $result; 操作符[]进行算术操作 a=2;b=2;result=$[a+b];echo $result; 操作符(())进行算术操作 a=3;b=2;result=$((a+b));echo $result; 利用bc工具进行浮点数和高级运算 a=1100100;echo "obase=10;ibase=2;scale=2;$a" | bc (obase,ibase的顺序不可调换) obase 表示要转换成的进制 ibase 表示原本的进制 scale 表示小数位个数
文件描述符及重定向 重定向操作符(>)默认使用stdout。如果想要将stderr重定向到文件中,必须将文件描述符编号置于操作符之前。养成重定向操作符前后必须加一个空格的习惯。 文件描述符0 表示stdin 文件描述符1 表示stdout 文件描述符2 表示stderr 将stderr重定向到一个文件,将stdout重定向到另一个文件 cmd 2> stderr.txt 1> stdout.txt cmd 代指命令 将stderr和stdout都重定向到一个文件中 cmd &> output.txt 利用tee将数据重定向到文件,同时提供一份副本作为后续命令的stdin cat a* | tee -a out.txt | cat -n 管道符左边是stdout形成右边的stdin。 tee命令只能从stdin中读取,-a命令是将读取的内容追加到out.txt文件末尾(不写这个参数,则默认会将文件覆盖),同时tee命令会生成一份副本作为后续命令的stdin。 如果cat a*有stderr则stderr信息将被直接打印在屏幕上,不会通过管道符传递。 利用输入重定向(<),创建一个文件描述符进行文件读取 exec 3< input.txt 使用exec创建一个文件描述符3指代文件input.txt cat <& 3 打印文件描述符3所指代的文件中的内容 文件描述符定义一次后只能使用一次,再次使用必须重新定义
数组 普通数组:array_var=( 1 2 3 ) 这些值存储在以0为起始索引的连续位置上 echo ${array_var[0]} 打印出特定索引的数组元素内容 echo ${array_var[*]} 以清单形式打印出数组中的所有元素 关联数组:declare -A ass_array 使用declare将一个变量声明为关联数组 ass_array=([apple]='100$' [orange]='150$') 定义关联数组 echo "apple costs ${ass_array[apple]}" 引用关联数组 echo ${#array_var[*]} 打印出数组中元素的个数 echo ${!array_var[*]} 打印出数组中索引的列表
从键盘或stdin中读取文本 read -n 2 var 输入两个字符存入变量var中 read -s var 输入的信息不要在屏幕上显示并存入变量var中 read -p "input:" var 输入前显示提示信息,将输入内容存入变量var中 read -t 2 var 将2秒内输入的所有字符存入变量var中 read -d ":" var 将符号:作为回车键使用
条件判断 条件被放置在中括号内,并且条件与中括号之间必须有一个空格间隔开 -eq 等于 -gt 大于 -lt 小于 -ne 不等于(非) -ge 大于或等于 -le 小于或等于 可以使用test命令来执行条件检测以代替中括号 if test $var -eq 0 等价于 if [ $var -eq 0 ]
读取、显示或拼接文件内容 cat a.txt b.txt > all.txt 打印多个文件内容并将打印出的stdout重定向到一个文件中 cat -s a.txt 压缩文件中相邻的空白行 cat -t a.txt 将文件中有制表符的那一行着重标记,记号为( ^|) cat -n -b a.txt 在输出的每一行前加上行号 -b 忽略空白行
录制并回放终端会话 script -t 2>a.log -a a.session 开始录制终端会话 scriptreplay a.log a.session 开始回放终端会话 -t 用于将时序数据导入stderr。2> 用于将stderr重定向到.log文件,存储时序信息,描述每一个命令在何时运行。.session文件用于存储命令输出。exit 结束录制。
文件查找与文件列表 查找出当前目录下所有以.txt或.pdf结尾的文件 find . \( -name "*.txt" -o -name "*.webp" \) -print 括号两端与内容之间必须有空格 -name 指定必须匹配的字符 -o 表示或的意思 查找当前目录下所有不以.txt结尾的文件 find . ! -name "*.txt" -print 将文件路径作为一个整体进行查找 find /home/users -path "*/music/*" -print 基于目录深度进行查找 find . -maxdepth 1 -name "f" -print 从当前目录向下查找的最大深度为1 find . -mindepth 2 -name "f" -print 从当前目录向下查找的最小深度为2 如果只允许find在当前目录中查找,将深度设为1,需要向下2级深度设为2,以此类推。 基于文件时间或大小进行查找 find . -type f -atime +7 查找用户最近一次访问文件到现在超过7天的所有普通文件 find . -type f -amin +7 查找用户最近一次访问文件到现在超过7分钟的所有普通文件 访问时间(-atime): 用户最近一次访问文件的时间 修改时间(-mtime): 文件内容最后一次被修改的时间 变化时间(-ctime): 文件权限最后一次被修改的时间 上面三个以天为计量的单位。 -amin -mmin -cmin 是以分钟为计量单位 其他查找方式 find . -type f -name "*.txt" -delete 删除当前目录下所有以.txt结尾的普通文件 find . -type f -perm 644 查找当前目录下所有权限为644的普通文件 find . -type f -user jack 查找当前目录下所有属于jack的普通文件 将文件权限由jack改为root sudo find . -name "*.txt" -type f -user jack -exec chown root {} \; 查找将.git目录排除在外的所有普通文件 find /home/users \( -name ".git" -prune \) -o \( -type f -print \)
构建单行命令 xargs的作用是接收stdin并将其转换成特定命令的命令行参数,供之后的命令使用。 echo "abxabxabxab" | xargs -d x -n 2 -d 指定x为输入定界符(默认定界符为‘ ’空格符) -n 指定每行最多几个参数 cat a.txt | xargs -I {} 内容:{} -I 指定了替换字符串样式为{}。对于每一个命令参数,第二个字符串{}都会被从stdin读取到的参数替换掉,有多少个参数命令就会执行多少次。参数被当做一个字符串,参数后面的换行符将被执行。 find . -type f -name "*.txt" -print0 | xargs -0 rm -f -print0 指明使用'\0'作为匹配的文件名之间的定界符 -0 设定xargs定界符为'\0'
对来自stdin的内容进行字符替换、字符删除或字符压缩 echo "HELLO WHO IS THIS" | tr 'A-Z' 'a-z' 大写替换成小写 只要'起始字符-终止字符'是一个连续的字符序列,那么它就是合法的集合 echo a 1 b 2 c 3 | tr -d -c '0-9 \n' 删除补集的所有内容 -d 指定要删除的集合 -c 使用给定集合的补集 echo a.txt | tr -s '\n' 压缩多余的换行符 -s 压缩stdin中重复的字符。tr只能通过stdin接受输入,不能使用命令行参数进行输入。
校验和加密 md5sum a.txt >a.md5 求文件的校验和并将结果重定向到.md5文件 md5sum -c a.md5 核实校验和,如果文件被改动则提示校验和不匹配 gpg -c a.txt 用gpg加密文件生成.gpg文件 gpg a.gpg 解密.gpg文件,非同一用户解密时需要密码验证 linux系统中用户密码存储地址:/etc/shadow openssl passwd -1 -salt 字符串 密码 生成密码的salt散列值
对文本文件和stdin进行排序操作 sort -n a.txt 按数字顺序进行排序 sort -r a.txt 按逆序进行排序 sort -M a.txt 按月份进行排序 sort -m a.txt b.txt 合并两个已排序过的文件 sort -nrk 2,3 a.txt 依据第2,3列,按照数字逆序形式进行排序 uniq要么使用管道,要么将排过序的文件作为输入。默认重复的行只会被打印一次 uniq -u a.txt 只显示文件中没有重复出现的行 sort a.txt | uniq -c 统计各行在文件中出现的次数 sort a.txt | uniq -d 找出文件中重复的行 sort a.txt | uniq -s 2 -w 3 忽略前两个字符,指定用于比较的最大字符数为3个
分割文件和切分文件名 split -b 10k a.txt -d -a 4 jack 将a.txt文件分割成每一份大小都为10kb的文件,分割成的文件前缀为jack,后缀为4个数字,数字由0000开始,每个文件依次加一。jack0000,jack0001,jack0002…… -b 按大小进行分割 -d 以数字为后缀(默认以字母aa为后缀) -l 按行数进行分割 -a 指定后缀长度(由最小字母或数字组成,a、0) 切分文件名时,*在哪边就从哪边开始匹配,贪婪模式会一直匹配直到剩下最后一个。 ${url%.*} 删除通配符(.*)从右向左匹配。%%表示贪婪 ${url#*.} 删除通配符(*.)从左向右匹配。##表示贪婪
创建特定大小的文件 dd if=/dev/zero of=a.txt bs=1M count=1 克隆给定的内容,将其写入指定大小的文件 if 表示被克隆的文件 of 表示接受克隆内容的文件 bs 表示字节块大小 count 表示块数
文本文件的差集与交集 comm a.txt b.txt -2 -3 打印a.txt文件的差集 comm a.txt b.txt -1 -3 打印b.txt文件的差集 comm a.txt b.txt -1 -2 打印a.txt和b.txt文件的交集 差集:包含在本文件中,但不包含在其他文件中的内容 交集:所列文件中所共有的内容 comm只能对排过序的文件进行操作
文件权限的修改 chmod u=rwx g=r o=r a.sh 指定文件a.sh的用户权限,用户组权限,其他用户权限 chmod a+x a.sh 为所有用户添加可执行权限 chmod o-x a.sh 取消其他用户的可执行权限 使用八进制值设置权限 r用4表示 w用2表示 x用1表示 chmod 777 a.sh 指定a.sh文件的用户权限为7,用户组权限为7,其他用户权限为7 chmod a+t /music 只有用户才能删除目录中的文件{t无可执行权限 T有可执行权限} chmod -R 777 . 以递归的方式修改当前目录下所有文件和子目录的权限 chown -R user.group . 将当前目录下所有文件的用户改为user及其所在组group chown user.group a.sh 将a.sh文件的用户改为user及其所在组group
给文件设置不可修改属性 chattr +i a.sh 添加a.sh文件的不可修改属性 chattr -i a.sh 取消a.sh文件的不可修改属性 linux系统DNS服务器配置文件:/etc/resolv.conf
为某个路径创建一个快捷方式 ln -i -s /var/www/ ~/web 为路径/var/www创建一个符号链接web readlink web 打印符号链接web所指向的目标路径 find . -type l -print 打印当前目录下的所有符号链接
查找文件或目录的差异 diff -u a.txt b.txt 打印a和b文件的差异{ + 新加入的行 - 删除的行 } diff -Naur /dev /etc 打印/dev和/etc目录的差异 -N 将所有缺失文件视为空文件 -a 将所有文件视为文本文件 -u 生成一体化输出 -r 遍历目录下的所有文件
打印文件的前10行和后10行 head -n 4 a.txt 打印a.txt文件的前4行(默认打印前10行) head -n -5 a.txt 打印a.txt文件除了最后5行之外的所有行 tail -n 4 a.txt 打印a.txt文件最后4行(默认打印后10行) tail -n +6 a.txt 打印a.txt文件第6行开始的所有内容 tail -f a.txt 监视a.txt文件,当文件内容增加时,打印出增加的内容 linux系统日志文件:/var/log/messages
统计文件的行数、单词数和字符数 wc -l a.txt 打印a.txt文件的行数 wc -w a.txt 打印a.txt文件的单词数(以空格或换行符为间隔) wc -c a.txt 打印a.txt文件的字符数 wc a.txt 打印a.txt文件的行数、单词数、字符数 wc -L a.txt 打印a.txt文件中最长一行的长度
在文件中搜索指定字符串 grep word a.txt b.txt 打印在a.txt和b.txt文件中搜索到的包含woed字符串的那一整行 --color=auto 打印时着重标记匹配到的字符串 -o 打印文件中匹配到的字符串,而不是它所在的那一整行 -c 打印文件中存在匹配字符串的所有行的数量 -n 打印文件中匹配字符串所在行的行号和整行内容 -l 打印匹配字符串所在文件的文件名 -v 打印不包含匹配字符串的所有行 -b -o 打印从匹配字符串所在行第一个字符起到匹配字符串第一个字符之间的字符总数 -i 只打印匹配字符串而不是整行且不考虑匹配字符串的大小写 --include a.txt 指定搜索a.txt文件 --exclude a.txt 排除搜索a.txt文件 -e "word1" -e "word2" 使用-e来指定多个匹配字符串 -f filename 从样式文件中读取匹配字符串 grep "test" file* -lZ | xargs -0 rm 删除包含匹配字符串的文件 -Z 输出以0字节作为终结符的文件名 打印出匹配文本之前或之后的行 seq 10 | grep 5 -A 3 打印匹配字符串数字5之后的3行 seq 10 | grep 5 -B 3 打印匹配字符串数字5之前的3行 seq 10 | grep 5 -C 3 打印匹配字符串数字5之后和之前的3行
查看文件中的某一列 cut -f 3 --complement -d ";" a.txt 打印a.txt文件中除第三列之外的所有列 -f 指定打印第几列 --complement 取所选列的补集 -d 指定某个符号为每列之间的定界符(默认是制表符为定界符) 打印a.txt文件中每行的第1-5,8-10区段的字符,输出结果时以','为定界符 cut -c 1-5,8-10 --output-delimiter "," a.txt
进行文本替换 sed -i "s/旧字符/新字符/g" a.txt 将a.txt文件中的旧字符替换成新字符并保存到原文件
将多个文件打包存档在一个文件里 tar -cf a.tar a.txt b.txt 将a.txt和b.txt文件存档到a.tar文件里 -c 创建一个新的存档 -t 列出存档文件中有哪些文件 -f 指定存档文件名,这个参数写在存档文件名前 -v 打印详细信息 -r 将新的文件追加到存档文件中 -x 从存档文件中提取文件(默认会提取所有文件到当前目录) -C /path 将提取出的文件放到指定路径下 -A 将后一个存档文件合并到前一个存档文件里 -d 打印存档文件中的文件与系统中同名文件的差异 -u 只有比存档文件中的同名文件更新时才会被添加到存档文件中,原文件依然保留 --delete a.txt 删除存档文件中的a.txt文件 --totals 在存档完成后打印出存档文件总字节数 tar -cf a.tar * --exclude "*.txt" 存档除.txt文件外的所有文件 tar -cf a.tar * -X list 存档除list清单所列举文件外的所有文件
压缩与解压缩 gzip -5 a.txt 将a.txt文件压缩成a.txt.gz文件,压缩率为5(最低1,最高9) gunzip a.txt.gz 将a.txt.gz文件解压成a.txt文件 tar -caf a.tar.gz a.txt 将a.txt文件存档到a.tar文件中,然后压缩成a.tar.gz文件 tar -xaf a.tar.gz 将a.tar.gz文件解压成a.tar文件,然后从中提取出所有文件 -a 从文件扩展名自动推断压缩格式 zip a.zip a.txt 将a.txt文件压缩到a.zip文件中 unzip a.zip 提取a.zip中的内容(不会删除a.zip文件)
其它Shell笔记 通配符 * 匹配任意字符串 ? 匹配不为空的一个字符
转义字符 \ 反斜线,使后面的字符恢复其原来作为单纯字符的用途 \ 后面是换行符时(回车键),上下输入的两行将视为一行
字符集合符号 字符集合就是[]中所列的字符范围中的一个字符,其长度为1 [a-c]* 匹配首字符是a、b、c的文件 [a,c]* 匹配首字符是a、c的文件 [!a,c]* 匹配首字符不是a、c的文件 把a和c换成数字也是同理
组合字符串 {a,b}_{1,2}=a_1 1_2 b_1 b_2 echo {A,a}pple=Apple apple 方便快速创建和删除文件及目录、方便匹配制定范围的字符串
管道 无名管道“ | ”,将一个程序的输出作为另一个程序的输入 有名管道,使用mkfifo创建一个管道文件,可以跨越终端将两个命令协同运行 终端1:mkfifo gd;echo 12 >gd; 终端2:cat gd; gd是管道文件不能当做文本文件 FIFO文件在磁盘上没有数据块,仅用来标识内核中的一条通道
前后台程序切换 sleep 100 & 将程序sleep放到后台运行 jobs 查看后台运行程序的状态 { + 正在运行的后台程序,如果程序已停止则会运行-号 - 接下来要运行的后台程序 } Ctrl+z 将程序暂停,然后放到后台不杀死,程序将会显示已停止 bg JOB_ID 将后台暂停的程序启动 fg JOB_ID 将后台的程序拉回前台立即运行 kill %JOB_ID 立即杀死后台运行的程序
定义别名 alias cdu="cd 下载 /vmware/Metasploitable2-Linux" 定义cdu表示后面的命令 unalias cdu 取消之前定义的别名cdu
|