shell

终端输出

变量

数组

清空文件:

> file.txt  
true > file.txt
cat -n > file.txt
truncate -s 0 file.txt 
cat /dev/null > file.txt

exec 创建文件描述符
alias 起别名
脚本内部$@和
$* 获取所有参数
$# 获取参数个数
$$ 当前线程/脚本的进程ID
KaTeX parse error: Expected 'EOF', got '&' at position 38: …处时获取java的 一个命令加&̲ 可以放到后台运行 cmd1 …line获取每一行数据。

cat /usr/shell/log.txt | while read line
do
    echo $line
done 		读取log.txt文件,每次循环读一行

在这里插入图片描述
for ip in 192.168.0.{1…255} ; 一种for循环写法

shell脚本通常以 #!/bin/bash 开头 (/bin/bash是bash解释器命令路径)

终端输出

每个命令或是命令序列是通过分号或换行符来分隔的。如:
echo aa;echo bb;
字符注释以#为起始,一直延续到行尾。如:
# 这是注释

echo是用于终端打印的基本命令。

echo hello shell;
echo 'hello shell';
echo "hello shell";
对于需要转义的字符(如:!),那就不要将其放入双引号,或者可以在其之前加上一个特殊的转义字符(\)将其转义,如:
echo 'hello shell !';
echo "hello shell \!"(会输出\)
echo -e "1\t2\t3"
echo -n "hello";echo -n "shell";

echo -e 用作转义序列
echo -n 忽略结尾换行符

另一个可用于终端打印的命令是printf。使用与c的printf一样。

printf "hello shell";
#!/bin/bash
printf "%-5s %-20s %-4s\n" No Name Mark
printf "%-5s %-20s %-4.2f\n" 1 qiu 20
printf "%-5s %-20s %-4.2f\n" 2 lin 30
printf "%-5s %-20s %-4.2f\n" 3 hao 40

此脚本输出结果
在这里插入图片描述
脚本写完后需要修改权限:chmod 777 脚本文件名。具体查看Linux文件权限设计。

$PID 检测登录用户是否是root,输出登录用户UID,root用户UID为0。
${str1:+str2} 如果str有值且不为空,则使用str2。

变量

初始化:变量名=变量值
如:

str=woshi
count=5

变量拼接字符串输出:

echo "we have $count $str"

获得字符串长度

str=apple
length=${#str}
echo ${#str}

识别当前所使用shell

echo $SHELL 或 echo $0

运算

no1=4;
no2=5;
let result=no1+no2
let resulta=(( no2 - no1))
echo $result;
let no1++
echo no1=$no1
let no2+=6
echo no2=$no2
result2=$[no1+no2]
echo result2=$result2
result3=$[$no1+5]
echo result3=$result3
result4=$((no1+no2))
echo result4=$result4
result5=`expr 4+3`
echo result5=$result5
result6=$(expr $no1 + 5)
echo result6=$result6

expr使用需要空格
bc的使用

result7=`echo "0.25 * 5" | bc`
# bc命令的使用
echo result7=$result7
# 设置小数精度
result8=`echo "scale=2; 3 / 8" | bc`
echo result8=$result8
# 进制转换
result9=`echo "obase=2;4" | bc `
echo result9=$result9 
# 2进制转10进制  obase为被转换数字进制,ibase为转换后机制
result10=`echo "obase=10;ibase=2;100" | bc`
echo result10=$result10
# 平方以及开平方
result11=`echo "sqrt(100)" | bc`
echo result11=$result11
result12=`echo "10^10" | bc`
echo result12=$result12                
文件描述符是与文件输入、输出相关联的整数。他们用来跟踪已打开的文件。最常见的文件描述符是stdin、stdout和stderr。我们甚至可以将某个文件描述符的内容重定向到另一个文件描述符中。
文件描述符是与某个打开的文件或数据流相关联的整数。文件描述符0、1以及2是系统预留的:
		0    ——stdin(标准输入)
		1    ——stdout(标准输出)
		2    —— stderr(标注错误)

将this is my dog写入到文件file_out.txt 中,先清空文件,再写入。

echo "this is my dog" > file_out.txt  

将this is my dog写入到文件file_out.txt 中,追加到文件末尾。

echo "this is my dog2" >> file_out.txt

将命令错误信息写进文件

ls + 2> file.txt

将命令结果写入文件

ls 1>> file.txt

命令执行结果错误写入err文件,正确写入out文件

ls + 2>>file_err.txt 1>>file_out.txt

命令正确和错误结果都写入同一个文件

ls + &> file.txt
ls >file.txt 2>&1     2>&1  含义是将标准错误重定向到标准输出
ls > file.txt  此处原命令是 ls 1> file.txt  只是> 默认是1
在输出中可能包含一些不必要的信息。如果不想让终端充斥有关stderr的繁枝末节。可将stderr重定向到/dev/null。
ls + 2> /dev/null

tee:即在终端打印,也输出到文件

echo aa | tee file.txt
cat b* | tee file.txt | cat -n    终端打印显示行号,写入文件不显示行号  tee默认覆盖 加上-a 追加
echo aaa | tee -   将aaa输出两遍,如果输出到文件也输出两次
cat file.txt | grep 'str'  在file.txt中寻找str的位置
cat   等待终端输入

/dev/null 是一个特殊的设备文件,它接收到的任何数据都会被丢弃。

command < file.txt 从文件读取数据 如

read var < file.txt
echo $var   输出结果是file.txt 第一行

< EOF >的使用,输出多行文本

cat <<EOF> file.txt 
i have a dog
EOF    将i have a dog 写入file.txt 文件

自定义文件描述符
文件描述符是一种用于访问文件的抽象指示器(abstract indicator)。存取文件离不开成为“文件描述符”的特殊数字。0、1和2分别是stdin、stdout和stderr的预留描述符编号。
可以使用exec命令创建自己的文件描述符。

exec 3<input.txt  
echo<&3   现在执行这条命令,就相当于执行echo < input.txt
exec创建的描述符只能使用一次
exec 4>input.txt
echo i have >&4     该命令会将 i have写入input.txt
exec 5>>input.txt
echo i have >&5  追加i have 到input.txt文件

数组

arr=(1 2 3 4)
arr[4]=5
echo ${arr[0]}
index=3
echo ${arr[$index]}
echo ${arr[*]}  清单形式打印数组中的所有值
echo ${arr[@]}  清单形式打印数组中的所有值
echo ${#arr[*]}  打印数组长度
shell数组切片 :${arr[*]:1:4}   ${数组名[*]:起始位置:长度}
shell数组替换:${arr[*]/23/32}   ${数组名[*]/查找字符/替换字符}
shell数组删除: unset arr[下标]

关联数组(map)

定义:declare -A arr1
	添加元素:arr1=([0]=1 [1]=2)  或者 arr1[0]=1;arr[1]=2;arr1[apple]=100
	获取元素:echo ${arr1[0]} ;echo ${arr1[apple]}
	列出数组索引:echo ${!arr1[*]} 或者 echo ${!arr1[@]}  输出map所有key

别名

alias 命令,=前后不能又空格
alias a='ls -a'   终端输入a,则执行ls -a

alias命令只是暂时的。一旦关闭当前终端,所有设置过的别名都将失效。为了使别名一直保持作用,可以放入~/.bashrc文件中。
需要删除别名:unalisa 例:unalisa lsa 或者 alisa a=
设置别名时,如果已有同名的别名存在,那么原有的别名设置将被新的设置取代。

日期时间及延时

date  打印当前日期
date +%s  打印当前纪元时,纪元是从1970年1月1日0时0分0秒起至当前时刻的总秒数
date --date '"Thu Nov 18 08:07:21 IST 2010" +%s  将指定日期转换为纪元
date --date "Jan 20 2001" +%A   获得指定日期星期几
date "+%d %B %Y"   打印当前日志年月日
date -s "21 June 2009 11:01:22"  设置日期和时间

在这里插入图片描述
脚本延时:
sleep n :延时几秒

调试脚本

bash -x xxx.sh sh -x xx.sh
运行带有-x标志的脚本可以打印出所执行的每一行命令已经当前状态。
使用set -x和set +x 对脚本进行部分调试。
在这里插入图片描述
将shebang从#!/bin/bash改成#!/bin/bash -xv ,可以启用调试。
shell脚本获取传参 $* 获取所有 $1 获取第一个参数 第0个是脚本名

函数

定义函数 function 函数名(){statement}
函数调用 函数名 参数1 参数2 ...
函数内获取传参:$1 $2
函数返回值在调用函数后通过 $? 来获得,一般函数执行成功返回0,否则为非0。
如果希望从终端调用函数,可将函数定义在主目录下的 /etc/profile 文件。

ls | cat -n
a=(ls | cat -n) 子shell
echo $a 与上个命令一起用
b=ls | cat -n 反引用
echo $b
子shell的概念贯穿整个shell,写shell脚本时更是不可不知。所谓子shell,即从当前shell环境新开一个shell环境,这个新开的shell环境就称为子shell(subshell),而开启子shell的环境称为该子shell的父shell。子shell和父shell的关系其实就是子进程和父进程的关系,只不过子shell和父shell是关联的bash进程。
子shell会从父shell中继承很多环境,如变量、命令全路径、文件描述符、当前工作目录、陷阱等等,但子shell有很多种类型,不同类型的子shell继承的环境不相同。可以使用 B A S H S U B S H E L L 变 量 来 查 看 从 当 前 进 程 开 始 的 子 s h e l l 层 数 , BASH_SUBSHELL变量来查看从当前进程开始的子shell层数, BASHSUBSHELLshellBASHPID查看当前所处BASH的PID,这不同与特殊变量值,因为会从父进程继承。
当使用子shell或反引用的方法将命令的输出读入一个变量中,可以将其放入反引号在,已保留空格和换行符。
out="$(cat file.txt)"

read命令
read是一个重要的Bash命令,它用于从键盘或标准输入中读取文本。
read -n n sum 从输入中读取n个字符存入sum ,-n 选项,n字符数:read -n 2 sum
read -s pwd 使用无回显的方式读取
read -p “please input:” str 显示提示信息
read -t timeout str 在特定时间内读取输入 read -t 2 str
read -d delim_char str 用特定的定界符作为输入行的结束 read -d “:” var
read var 将用户输入赋值给var

repeat()
{
 while true
 do
 $@ && return
 done
} 
 与上方代码效果一致
repeat() { while :; do $@ && return; done }	  $@为传入的命令,命令执行完脚本才退出

字段分隔符和迭代器

内部字段分隔符(Internal Field Separator,IFS)是shell脚本编程中的一个重要概念。在处理文本数据时,它的用途可不小。内部字段分隔符是用于特定用途的定界符。IFS是存储定界符的环境变量。是当前shell环境使用的默认定界字符串。
data="name,sex,pwd,height"
oldIFS=$IFS
IFS=,
for item in $data;
do 
    echo Item:$item
done

输出结果
Item:name
Item:sex
Item:pwd
Item:height
IFS默认值是空白字符(换行符、制表符或者空格)
当IFS被设置为逗号时,shell将逗号视为一个定界符,因此变量$item在每次迭代中读取由逗号分隔的子串作为变量值。
如果没有设置IFS为逗号,那么什么的脚本会将全部数据作为单个字符打印出来

echo {1..10} 生成一个1~10的序列,echo {a..z},echo {A..Z}生成字母序列。
for item in {1..10}; do actions; done; 
for((i=0;i<10;i++)){}
whild condition do cmds done
until condition do done
if conditions; then cmds; fi
if conditions; then cmds; else if conditions; then cmds else cmds fi
if [ $sum -eq 1 ];
then
    echo 1
fi

算数比较符: 条件通常被放置再封闭的中括号内。一定要注意在[ 或 ]与操作数之间有一个空格
-gt 大于
-lt 小于
-ge 大于或大于
-le 小于或大于
-eq 等于
-ne 不等于
在这里插入图片描述
字符串比较:比较符有一个空格
[[ $str1 = $str2 ]]
[[ $str1 == $str2 ]]
[[ $str1 != $str2 ]]
[[ $str1 > $str2 ]]
[[ $str1 < $str2 ]]
[[ $str1 =~ $str2 ]] 字符1是否包含字符2
[[ -z $str ]] 如果str包含的是空字符串,返回真
[[ -n $str ]] 如果str是非空字符串。返回真
使用逻辑运算符 && 和 || 能够将多个条件连起来

if [[ -n $str1 ]] && [[ -z $str2 ]] ;
then
 commands;
fi 

if test $var -eq 0 ; then echo "True"; fi

cat命令

cat读取多个文件:cat file1 file2
将输入文件的内容与标准输入拼接在一起:echo 'i have a' | cat - fine.txt
cat -s file.txt  压缩相邻的空白行,只是压缩,总会有一行空格
cat -T file  将制表符注重标记出来,显示为^I
cat -n file 为输出的每一行内容前加上行号。甚至会为空白行加上行号,如果想跳过空白行,可以使用-b

find命令

find命令的工作方式如下:沿着文件层级结构向下遍历,匹配符合条件的文件,执行对应的操作。
find base_path 列出当前目录及子目录所有的文件和文件夹
find . print 打印当前目录文件和目录的列表
find . print0 指明'\0'作为匹配的文件名之间的定界符
find . -name "*.txt" -print
find . -iname "*.txt" -print  忽略文件大小写
find . -name "*.txt" -o -name "aa*" 查找以txt结尾或则aa开头的文件
find -path "*she*"  文件全路径包含she的文件
find -size +20k -size -1000k  大小大于20k小于1000k的文件

在这里插入图片描述

find -reges   正则表达式匹配    -iregex 正则表达式忽略大小写
find . ! -name "*.txt" 不以.txt 结尾的文件
find -maxdepth -mindepth  限制find命令遍历目录深度
find -type  按文件类型匹配

在这里插入图片描述
find -atime -mtime -ctime 按文件时间搜索,分别是访问时间、最后一次修改时间、变化(权限或所有权)时间,单位是天,用+ - 来做计算
find . -atime -7 查看7天内被访问的文件
find -newer 指定一个用于比较时间戳的参考文件,然后找出比参考文件更新(更近的修改时间)的文件

find . -newer fine.txt
find -delete 可以用来删除匹配到的文件
find . -name "*.txt" -delete  删除txt结尾的文件
find -perm  根据文件权限进行匹配
find . -perm 777   
find -user  找出特定用户所拥有的文件 参数可以是用户名或UID
find -user root
	find -user 0
find -exec  执行命令或动作
find . -name  "input*" -exec chmod 777 {} \;   将input开头的文件执行权限改为777  {}是一个与-exec选项搭配使用的特殊字符串。对于每一个匹配的文件,{}会被替换成对应的文件名。-exec后面跟的是cmd命令,它的终止是以;标志结束的,所以命令后面的;必不可少,考虑到各个系统中分号会有不同的意义,所以加反斜杠。
find . -name "*.sh" -exec cat {} \; >> input.txt  读取所有.sh文件内容,写入input.txt 

find -prune 跳过指定目录

find . \( -name "bb" -prune \) -o -name "*.txt"  查找当前目录的.txt文件,不找bb文件夹下的

xargs

有些命令只能以命令行参数的形式接受数据,而无法通过stdin接受数据流。xargs擅长将标准输入数据转换成命令行参数。能够处理stdin并将其转换为特定命令的命令行参数。也可以将单行或多行文本输入转换成其他格式,例如单行变多行或单行。
sargs命令把从stdin接收到的数据重新格式化,再将其作为参数提供给其他命令。
可以作为一种替代,其作用类似于find命令中的-exec(查找文件并进行操作:如更改权限)。
cat file.txt | xargs   读取文件内容,并一行输出。
	cat file.txt | xargs -n 3  读取文件内容,每行3个参数,-n 指定每行出现几个参数(字符串,按""切割)。
	echo "abcdabcdabcd" | xargs -d a   按a切割字符串(切割后不包含a)-d指定一个定制的定界符。
	echo "abcdabcdabcd" | xargs -d a -n 2 结合-n选项,可以将输入划分为多行,而每行包含两个参数。
	cat file.txt | xargs -I(大写i) {} ./cecho.sh -p {} -l     拼接命令,读取file.txt(里面全是参数)内容,第一个{}循环参数,第二个是参数替换位置,每个参数执行一遍./cecho.sh脚本。
	-0 选项 表示已'\0'为分隔符,一般与find结合使用
结合find使用xargs:
	find . -name "*.txt" | xargs rm -rf   删除.txt文件,注意:此处find

tr

经常用来编写优美的单行命令,作业不容小觑。tr可以对标准输入的内容进行字符替换、字符删除以及重复字符压缩。可以将一组字符编程另一组字符,因而通常也被称为转换命令。
echo hello shell | tr 'a-z' 'A-Z'    将小写字符转换为大写输出
echo 12345 | tr '0-9' '9876543210'   输出结果为87654,加密
echo 87654 | tr '9876543210' '0-9'   输出结果为12345,解密
-d 删除字符,删掉交集,输出字符1有,字符2没有的数据
echo hello 123 | tr -d '0-9'   输出结果为:hello
-c 字符集补集,输出并集,字符1和字符2都有的数据
echo hello 123 | tr -d -c '0-9'   输出结果为:123
-s 压缩字符,压缩输入中重复的字符
echo  hello apple | tr -s 'a-z'   输出结果为:helo aple
使用tr让文件中的数字相加
cat sum.txt | echo $[ $(tr '\n' '+' )] 0     sum.txt中每行一个数字,tr将'\n' 替换成+,多出来的一个+,再追加一个0
字符类
tr可以像使用集合一样使用各种不同的字符类,这些字符类如下所示:
	 alnum:字母和数字。
	 alpha:字母。
	 cntrl:控制(非打印)字符。
	 digit:数字。
	 graph:图形字符。
	 lower:小写字母。
	 print:可打印字符。
	 punct:标点符号。
	 space:空白字符。
	 upper:大写字母。
	 xdigit:十六进制字符
	例:echo hello | tr '[:lower:]' '[:upper:]'   将小写字母换成大写

校验和与核实

校验和程序用来从文件中输出校验和密钥,然后利用这个校验和密钥核实文件的完整性。
用的多的是md5sum和SHA-1

md5sum  生成一个32个字符的十六进制串。
md5sum file.txt  > file_sum.md5   根据文件生成一个32个字符十六进制串,一般将其记录在文件里。也使用多个文件。
		md5sum -c file_sum.md5   用生成的文件核验数据完整性
	SHA-1 从给定输入文件中生成一个长度为40个字符的十六进制串,用法跟md5sum非常相似,只需将命令中的md5sum替换为sha1sum即可

对目录进行校验
	$ md5deep -rl directory_path > directory.md5
# -r使用递归的方式
# -l使用相对路径。默认情况下,md5deep会输出文件的绝对路径

或者也可以结合find来递归计算校验和:
$ find directory_path -type f -print0 | xargs -0 md5sum >> directory.md5
用下面的命令进行核实:
$ md5sum -c directory.md5

排序、唯一和重复

sort对文本文件和stdin进行排序操作

sort file1.txt file2.txt > sorted.txt   将两个文件内容排序后输入文件
	sort file1.txt file2.txt -o sorted.txt   同上
	-o  重定向输出到文件
	-n  以数值型进行排序,默认使用字符串排序
	-r 逆序排序
	-M 按月份排序
	-m 合并两个已排序过的文件
	sort file1.txt file.txt2 | uniq  找出已排序文件中不重复的行
	-c 检查输入是否已有序
	-C 类似-c,但不报告第一个无序行,可写脚本检测文件是否已排过序
	sort -C filename ;
	# $? 获取sort -C 执行返回值
if [ $? -eq 0 ]; then
 echo Sorted;
else
 echo Unsorted;
fi 
-k 指定按那一列排序,通常在默认清空下,键就是文本文件中的列。列和列用空格分隔。
sort -k 2 file.txt   2是说按第二列数据进行排序
	ps | sort -k 4    将ps命令执行结果按第四列排序
	sort -k 2,3 file.txt   按每行第二、三和字符排序
-b 忽略前导空白区域
-d 只考虑空白区域和字母字符,与-b一起用
-f 忽略大小写
-z 以0字节而非新行作为行尾标志,配合xargs -0使用

uniq

通过消除重复内容,从给定内容输出中(stdin或命令行参数文件)找出唯一的行。它也可以用来找出输入中出现的重复行。
uniq只能作用于排过序的数据输入。
-u 输出文件中没有出现重复的行
-c  统计各行出现次数
-d 找出重复的行
-s 跳过前n个字符 
-w 指定用于比较的最大字符数

临时文件命令和随机数

编写shelll脚本,经常需要存储临时数据。最适合存储临时数据的是/tmp目录(重启会清空)。
filename=`mktemp`
echo $filename  创建临时文件
dirname=`mktemp -d`
echo $dirname  创建临时文件夹,都创建在/tmp下
tmpfile=`mktemp -u`
echo tmpfile  仅生成文件名,不创建文件
mktemp test.XXX   指定生成文件名前缀。至少要有3个X

分割文件和数据

split

-b 拆分后文件大小
split -b 1k file.txt   将文件拆成1k一个
-d 以数字问文件名后缀,默认是字母后缀
-a 指定拆分后后缀长度
split -b 1k  file.txt -d -a 4
指定文件前缀
split -b 1k  qianzhui
-l    按行数切割
split -l 10 file.txt

csplit

根据扩展名切分文件

file_jpg="sample.jpg"
	name=${file_jpg%.*}
	echo $name      name值为sample
	name2=${file_jpg#.*}
	echo $name2       name2值为jpg
${var%.*}含义:从$var中删除位于%右侧的通配符(.*)所匹配的字符串。通配符从右到左进行匹配。%属于非贪婪(non-greedy)操作。它从右到左找出匹配通配符的最短结果。还有个%%,与%类似,但行为模式是贪婪的,它会匹配最长的字符串
str="ab.cd.ef"
	a=${str%.*}
	echo $a       a=ab.cd
	b=${str%%.*}
	echo $b       b=ab
${var#.*}含义:从$var中删除位于#右侧的通配符所匹配的字符串。通配符从左到右匹配。
也有个贪婪操作符## 
str=ab.cd.ef
a=${str#*.}
echo $a     	 a=bc.de
b=${str##*.}
echo $b			b=de

批量重命名和移动

	rename    
rename "jpg" "JPG" *        将当前文件夹内所有jpg都改为JPG
将文件名中的空格替换成字符“_”:
$ rename 's/ /_/g' * 
转换文件名的大小写:
$ rename 'y/A-Z/a-z/' *
$ rename 'y/a-z/A-Z/' * 
 将所有的 .mp3文件移入给定的目录:
$ find path -type f -name "*.mp3" -exec mv {} target_dir \;
 将所有文件名中的空格替换为字符“_”:
$ find path -type f -exec rename 's/ /_/g' {} \; 
	具体看linux shell脚本攻略2.13节,我使用没啥效果
	自提:链接:https://pan.baidu.com/s/11Rq2QuwbWvFyRF1bHB7EeA 

提取码:nh45

交互输入自动化

	#!/bin/bash  脚本
#文件名: interactive.sh
read -p "Enter number:" no ;
read -p "Enter name:" name
echo You have entered $no, $name; 
	$ echo -e "1\nhello\n" | ./interactive.sh
You have entered 1, hello 
	还有./interactive.sh < input.data   从文件导入交互式输入数据
#/bin/bash
#文件名: generate_checksums.sh
PIDARRAY=()
for file in File1.iso File2.iso
do
 md5sum $file & 
 PIDARRAY+=("$!")
done
wait ${PIDARRAY[@]} 
利用了Bazh的操作符&,它使得shell将命令置于后台并继续执行脚本。这意味着一旦循环结束,脚本就会退出,而md5sum命令仍在后台运行。为了避免这种情况,我们使用$!来获得进程的PID,在Bash中,$!保存着最近一个后台进程的PID。我们将这些PID放入数组,然后使用wait命令等待这些进程结束。

文本文件的差集和交集

comm:可用于两个文件之间的比较。有很多不错的选项可以用来调整输出,以便我们执行交集、求差以及差集操作。
	交集:打印出两个文件所共有的行
	求差:打印出指定文件所包含的且不相同的那些行
	差集:打印出包含在文件A中,但不包含在其他指定文件中的那些行
comm必须使用排过序的文件
comm a.txt b.txt     输出结果第一列是a.txt文件独有内容,第二列是b.txt文件独有内容,第三列是共有内容。
comm a.txt b.txt -1 -2    删除输出第一列和第二列,得到共有内容
comm a.txt b.txt -3    输出独有内容
comm a.txt b.txt -3 | sed 's/^\t//'   去掉空白字段

查找并删除重复文件

通过文件生成校验和进行比较,校验和相同的,文件内容就是一致的。

文件权限、所有权和粘滞位

ls -l命令 第一个字符为文件类型
	 - —— 普通文件。
	 d —— 目录。
	 c —— 字符设备。
	 b —— 块设备。
	 l —— 符号链接。
	 s —— 套接字。
	 p —— 管道。
剩下划分为三组,每组3个字符。第一组对应用户权限,第二组对应用户组权限,第三组对应其他用户权限。每组rwx为读写执行。
用户权限有个S(setuid)权限,出现在x(执行权限)位置。它运行用户以其拥有者的权限来执行可执行文件,即使这个文件是由其他用户运行的。
用户组权限S(setgid)权限,运行以同该目录拥有者所在组相同的有效权限来允许可执行文件。但是这个组和实际发起命令的用户组未必相同。
目录有一个特殊的权限,叫粘滞位(sticky bit)。如果目录设置了粘滞位,只有创建该目录的用户才能删除目录中的文件,即使用户组和其他用户组也有写权限,也无能为力。粘滞位出现在其他用户权限中的执行权限(x)位置。用t或T来表示。如果没有设置执行权限,但设置粘滞位,就使用t,如果设置执行权限和粘滞位,使用T。典型例子就是/tmp
chmod u=rwx g=rw o=r filename    u 用户权限 g用户组权限 o 其他实体权限,可以用+添加权限,-删除权限
chmod a+x filename   给所有权限类别添加执行权限
八进制数设置权限:r--4 w--2 x--1
chmoe 777 filename
chown 修改所有权
chown user.group filename

设置粘滞位:chmod a+t directory_name
以递归的方式设置权限:
chmod 777 . -R    . 为当前目录,-R指定以递归方式修改权限
递归方式设置所有权
chown user.group . -R
设置文件不可修改
chattr +i filename
chattr -i filename

批量生成空白文件

for name in {1..100}.txt
do
 touch $name
done
touch -a 更改文件访问时间
touch -m 只改文件内容修改时间
touch -d d "Fri Jun 25 20:50:14 IST 1999" filename  指定时间日期,也可写 "Jan 20 2010"

查找符号连接及其指向目标

列举文件类型统计信息

file  打印文件类型信息
file filename    输出文件类型
file -b filename    只打印文件类型

查找文件差异并进行修补

patch 将修补文件中包含的更改信息应用到原始文件。也可以再次进行修补来撤销改变。
diff 1.txt 2.txt > diff.txt   生成差异文件
patch -p1 1.txt < diff.txt        diff.txt是diff命令生成的差异文件,通过读取差异文件内容修改文件。
patch -R 1.txt < diff.txt  撤销修改
diff  生成差异文件。非一体化形式diff输出例:diff file1.txt  file2.txt   。
diff -u    一体化形式的diff输出。
diff命令也可以以递归形式作用与目录。它会对目录中的所有内容生成差异输出。
diff -Naur directory1 directory2
-N	将所有缺失的文件是为空文件
-a		将所有文件视为文本文件
-u		生成一体化输出
-r		遍历目录下的所有文件

使用head 和tail打印文件前10行和后10行

head 读取输入文件的头部
-n		打印前几行,后面跟负数,表示打印除了最后几行之外所有行
head -n -4 filename   打印除最后6行以外所有行
tail 打印文件最后若干行
tail filename
-n   打印最后几行,后面接 +n,表示打印n-1行到最后一行
tail -n +6  打印第五行到最后一行
tail的一个主要用法是从一个内容不断增加的文件中读取数据。新增的内容总是被添加到文件的尾部。
-f		使tail密切关注文件新添加的内容,并随着数据的增加持续保持更新。会一直执行到新增文件内容的线程结束。
-s		睡眠间隔,可以设置监听文件更新的时间间隔。

只列出目录的方法

ls -d */
	ls -F | grep "/$"
	ls -l | grep "^d"
   find / -type d 

统计文件的行数、单词数和字符数

wc
统计文件行数、单词数、
		wc file.txt 
		-c 显示字节数
		-l  显示行数
		-w 显示单词数
		-m 输出字符数
		-L 显示最长行的长度

用grep在文件中搜索文本

grep str filename  在filename中搜索str
--color   着重标记匹配字符
-E		使用扩展正则表达式,或者使用 egrep
-o		只输出匹配部分
-v		将匹配结果反转,输出不匹配的内容
-c		统计匹配行的数量
grep t aa.sh | egrep -c t  | wc -l     显示字符出现次数
-n		打印匹配行号
-l		搜索多个文件并找出匹配文本位于哪一个文件
-L		与-l相反,返回不匹配的文件列表
-r		递归搜索,-R也是此效果
例: grep text_function() . -r -n
-i		忽略大小写
-e		匹配多个样式,例:
	echo this is a line of text | grep -e "this" -e "line" -o
--include		搜索过程指定某些文件
--exclude		搜索过程排除某些文件
grep "main()" . -r --include *.{c,cpp}		目录中递归搜索所有.c和.cpp文件
	grep "main()" . -r --exclude "README" 		搜索排除所有readme文件
-Z		输出以0值字节作为终结符的文件名,通常与 -l 结合使用

静默输出

不打算查看匹配的字符串,而只想指定是否能够成功匹配。可通过 -q 静默选项来实现。在静默模式中,grep命令不会输出任何内容。仅是运行命令,然后根据命令执行结果成功与否返回退出状态。成功返回0,石板返回非0值。

-A		打印匹配某个结果之后的n行
grep -A 3 txt  aa.sh
-B	打印匹配某个结果之前的n行
grep -B 3 txt  aa.sh 
-C		打印某个结果之前以及之后的n行
grep -C 3 have variate.sh
多个匹配,会有 -- 作为各部分之间的定界符
grep执行过后会有返回值,如果查出来了,则返回不为空的字符串,否则返回空
result=$(echo hello | grep lo)
result=$(echo hello | grep kl)

用cut按列切分文件

cut [-options] fileA
	-b  以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了-n标志。
	-c  以字符为单位进行分割。
	-d  指定义分隔符,默认为制表符。
	-f  与-d一起使用,指定显示哪个区域。每行都各有一个区域
	-n  取消分隔多字节字符。-b一起使用。
	--complement		对提取字段进行补集运行,就是说打印匹配字段之外的数据
echo hello,aplle,all  | cut -d, -f1    以,分隔,获取第一个
cut -d, -f 2,3 file.txt   每行按,分隔,输出每行第23列
cut -d, -f3 --complement aa.txt		按,分隔,不输出第3列
cut -c1-5 filename		打印每行第15个字符,负数表示打印前几个字符

使用sed进行文本替换

sed是流编辑器(stream editer) 的缩写。它是文本处理中不可或缺的工具,能够配合正则表达式使用。sed命令众所周知的一个用法是进行文本替换。
sed命令至少打印后的文本,不会保存修改
-i		保存修改
sed只替换每一行第一个匹配的内容
匹配字符处加个g	,替换所有内容,而不是只替换每一行第一个
sed 's/a/g' filaname     将文件中的 a 替换成g。s含义暂时还不知道
默认情况下,sed指挥打印替换后的文本。如果需要在替换的同时保存更改,可以使用 -i 选项,可以将替换结果应用于原文件。
sed -i 's/a/g/g' filename    将修改保存到原文件
sed命令只替换每一行第一个匹配内容,在匹配字符出价格g
sed -g 's/a/g/g' filename     替换所有,默认替换第一行第一个
字符 / 在sed中被作为定界符使用。
移除空白行
sed '/^$/d' filename  去除空白行
&		标记匹配样式的字符串
sed 's/\w\+/[&]/g' aa.txt   含义:\w\+  表示文件中每个单词,& 对应\w\+ 匹配所有内容,此命令含义是将所有单词用[] 包起来
子串匹配标记
echo this have 7 in have 8 | sed 's/have \([0-9]\)/\1/'   此处会将 have 7 替换为7
echo seven EIGHT | sed 's/\([a-z]\+\) \([A-Z]\+\)/\2 \1/'  输出结果为EIGHT seven
组合多个表达式
echo abc | sed 's/a/A/' | sed 's/c/C/'
echo abc | sed 's/a/A/;s/c/C/'
echo abc | sed -e 's/a/A/' -e  's/c/C/'
sed表达式通常用单引号来引用。也可以用双引号。双引号会通过对表达式求值来对其进行扩展。在sed中表达式使用一些变量时
$ text=hello
$ echo hello world | sed "s/$text/HELLO/"
HELLO world 

使用awk进行高级文本处理

awk是一款设计用于数据流的工具。它可以对列和行进行操作。灵活性是awk最大的优势。
脚本结构
awk ' BEGIN{ print "start" } pattern { commands } END{ print "end" } file
工作方式:
	(1) 执行BEGIN { commands } 语句块中的语句。
	(2) 从文件或stdin中读取一行,然后执行pattern { commands }。重复这个过程,直到文件全部被读取完毕。
	(3) 当读至输入流末尾时,执行END { commands } 语句块。
	BEGIN语句块在awk开始从输入流中读取行之前被执行。这是一个可选的语句块,诸如变量初始化、打印输出表格的表头等语句通常都可以写入BEGIN语句块中。
	END语句块和BEGIN语句块类似。END语句块在awk从输入流中读取完所有的行之后即被执行。像打印所有行的分析结果这类汇总信息,都是在END语句块中实现的常见任务(例如,在比较过所有的行之后,打印出最大数)。它也是一个可选的语句块。
	最重要的部分就是pattern语句块中的通用命令。这个语句块同样是可选的。如果不提供该语句块,则默认执行{ print },即打印所读取到的每一行。awk对于每一行,都会执行这个语句块。这就像一个用来读取行的while循环,在循环体中提供了相应的语句。
输出文件行数
awk "BEGIN { i=0 } { i++ } END{ print i }" filename

按列合并文件

paste 
paste file1.txt file2.txt   将文件按此顺序行与行合并,以换行符为分隔符
-d指定分隔符
paste file1.txt file2.txt -d ","      将文件按此顺序行与行合并,以,为分隔符,默认是换行符。

打印文件或行中的第n个单词或列

ls -l awk '{ $1 $3 }'    打印第一列和三列
ls -l | cut -d " " -f1		打印第一列

打印行或样式之间的文本

cat filename | awk 'NR==4, NR==29'    打印文件第4行到第29行的内容
awk '/cecho.sh/, /log.txt/' filename		打印文件cecho.txt到log.txt的内容

逆序打印

tac		反过来书写的cat

文本切片及参数操作

words="this is a apple"
	echo ${words/apple/orange}   将words中的apple替换为orange,只替换一个
根据下标切割字符串,下标从0数起
str="abcdefg"
	echo ${str:4}   输出efg
	echo ${str:2:4}		输出cdef,意为从第二位开始输出4位
	echo ${str:(-2):2}		输出fg,从倒数第二位开始,输出两位

web页面下载

wget 用于文件下载的命令行工具,选项繁多且用法灵活
wget URL
whet URL1 URL2..		可以指定从多个URL下载
wget www.baidu.com		保存百度首页html
-O		指定输出文件名,即下载后文件名。通常与URL中文件名会保持一致。
-o		指定日志信息输出文件,默认是打印到stdout
-t		指定重试次数,0 表示不停重试
-c		从中断出继续下载,用于下载进行中被打断
--post-data		发生post请求,后面接参数,用&分隔。"name=aa&pwd=123"
wget --mirror --convert-links exampledomain.com
wget -r -N -l -k DEPTH URL		两个都是下载整个网站

cURL入门

强力工具,cURL支持HTTP、HTTPS、FTP在内的众多协议。还支持POST、cookie、认证、从指定偏移处下载部分文件、参照页(referer)、用户代理字符串、扩展头部、限速、文件大小限制、进度条等特性。
curl URL		下载文件输出到终端
--silent		避免curl命令显示进度信息
-o		将下载数据写入文件
--progress		下载过程中显示#进度条

断点续传
	curl可以从特定的文件偏移处继续下载。可以通过指定一个偏移量来下载部分文件
	curl URL/file -C offset
	偏移量是以字节为单位的整数。如果只是想断点续传,那么curl不需要指定准确的字节偏移。要是希望curl推断出正确的续传位置,使用选项 -C -,像这样
	curl -C - URL
	curl会自动计算出应该从哪里开始续传。

--referer		设置参照页字符
--cookie		设置cookie
--user-agent		设置用户代理
--limit-rate		限定curl占用带宽
--max-filesize		指定最大下载量
-d		发生post请求

用tar归档

tar命令可以对文件进行归档。tar可将多个文件和文件夹保存为单个文件,同时还能保留文件属性。
	-c		创建文件		
	-f		指定文件名
	-v		列出详细信息
	-r		往已归档的文件再添加一些文件
	-x		提取文件当当前目录
	-C		指定文件提取到哪个目录
	-A		合并两个tar文件
	-u		只有比归档文件中的同名文件更新时才会被添加
	-d		打印归档文件和文件系统中是否有差异
	--delete		从归档文件中删除文件
压缩功能
	-j		压缩为bunzip2格式
	-z		压缩为gzip格式
	--lzma		压缩为lzma格式
	-a 或 --auto-compress		根据扩展名自动进行压缩
	--exclude		排除匹配通配符样式的文件
	-X	后接一个问价名,将文件内的文件列表排除归档
	--totals		打印总归档字数
tar -cf output.tar [SOURCES]		对文件进行归档
	例:tar -cf aa.tar aa.txt bb.txt
tar -tf xx.tar		列出归档文件中所包含的文件
	例:tar -tf aa.tar
tar -tvf aa.tar		归档会列出归档文件列表时获知更多细节,如文件权限、所有者等。选项顺序一定是 tvf
	tar -tvf aa.tar
tar	-rvf aa.tar [SOURCES]		往已归档文件添加一个文件
	tar -rvf aa.tar cc.txt
tar -xf	aa.tar		将归档文件的内容提取出来
tar -xf aa.tar -C /usr/local		将归档文件提取到/usr/local目录
tar	-xvf aa.tar aa.txt		将归档文件中的aa.txt提取出来
tar -A aa.tar bb.tar		合并两个tar文件
tar -uf aa.tar aa.txt		如果aa.txt与tar中的不一致,则更新tar中的aa.txt
tar -df aa.tar		比较归档文件和文件系统中的内容
tar -cf aa.tar * --exclude "*.txt"		归档排除txt文件
tar -cf aa.tar aa.txt bb.txt --totals		打印归档总字数

用gzip压缩数据

gzip时GUN/Linux平台常用的压缩格式。gzip、gunzip、zcat都可以处理这种压缩文件类型。但gzip只能压缩单个文件或数据流,而无法对目录和多个文件进行归档。
gzip可以用于压缩和解压缩。
压缩文件	
	gzip filename

解压缩文件
	gunzip filename.gz			解压缩后,gz包就没了
列出压缩文件的属性信息
	gzip -l filename.gz
可以从stdin中读取文件,也可以将压缩文件写出到stdout
	cat filename | gzip -c > file.gz
	选项-c用来将输出指定到stdout
可以指定gzip的压缩级别。用--fast或--best选项分别提供最低或最高的压缩比。
gzip一般与tar命令一起使用,压缩归档文件
tar -xavvf archive.tar.gz -C extract_directory		提取经由gzip压缩的归档文件中的内容。
rcat		无需解压,直接读取gzip格式文件
压缩率,有9级,一级压缩率最低,压缩速度最快。9级压缩率最高,压缩速度最慢。
gzip -5 aa.txt		按5级压缩率压缩文件。

bzip2

常用工具,功能和语法同gzip非常相似。唯一的不同在于bzip2的压缩率比gzip更高,但花费的时间比gzip更长。
bzip2 filename		压缩文件
	bunzip2 filename.bz2		解压缩bzip2格式的文件
	tar -xjvf test.tar.bz2		生成tar.bz2文件并从中提取内容

lzma

另一种压缩工具,丫的压缩率比gzip和bzip2更好
lzma filename		压缩文件
	unlzma filename.lzma		解压缩文件
	tar -cvvf --lzma test.tar.lzma [FILES]		对tar归档文件进行压缩或提取
	tar -cavvf test.tar.lzma [FILES]		同上
	tar -xvvf --lzma test.tar.lzma -C extract_directory		将经过lzma压缩过的tar归档文件中的内容提取到指定目录,-x 用于提取内容,--lzma指定使用lzma对归档文件进行解压缩
	tar -xavvf test.tar.lzma -C extract-directory		同上

用zip归档和压缩

zip test.zip [SOURCE FILES/DIRS]		对归档文件采用zip压缩
	-r		递归操作
	-u		更新压缩文件中的内容
	-d		删除压缩文件中的内容
zip test.zip aa.txt bb.txt		将aa.txt和bb.txt压缩进test.zip
zip -r test.zip folder1 folder2		压缩文件夹,递归压缩
zip -u test.zip aa.txt		更新test.zip的aa.txt文件
zip -d test.zip aa.txt		删除test.zip的aa.txt
解压缩
unzip file.zip		加压缩zip文件,解压缩完成后,不会删除zip文件
	-l		列出压缩文件内容
unzip test.zip		解压缩test.zip
	unzip - test.zip		查看test.zip压缩包内容

更快的归档工具pbzip2

能借助多个处理器核心来降低压缩文件所需的时间。
需要安装
pbzip2 myfile.tar		压缩单个文件。pbzip2会自动检测系统中处理器核心的数量,然后将myfile.tar.bz2
	要压缩多个目录,可以配合tar使用:tar cf myfile.tar.bz2 --use-compress-prog=pbzip2 dir_to_compress/ 或者 tar -c directory_to_compress/ | pbzip2 -c > myfile.tar.bz2 
提取文件
pbzip2 -dc myfile.tar.bz2 | tar x 		解压缩tar.bz2文件
	pbzip2 -d myfile.tar.bz2		加压缩经过pbzip2压缩过的归档文件

使用rsync备份系统快照

-a		进行归档
-v		再stdout上打印细节信息或进度
-z		指定在网络传输时压缩数据
 rsync -av source_path destination_path		将源目录复制到目的端,
 rsync -av /home/slynux/data slynux@192.168.0.6:/home/backups/data
 user@host		用户名@主机ip或主机名
 将数据备份到远程服务器或主机
 	rsync -av source_dir username@host:PATH
 将远程主机上的数据恢复到本地主机
 	 rsync -av username@host:PATH destination
 在网络传输时压缩数据
 	rsync -avz source destination
 将一个目录中的内容同步到另一个目录
 	 rsync -av /home/test/ /home/backups
 将包括目录本身在内的内容复制到另一个目录
 	rsync -av /home/test /home/backups

curl --location --request POST ‘http://localhost:8080/aa’
–header ‘Origin: http://localhost:8080’
–header ‘Content-Type: application/json’
–header ‘Cookie: JSESSIONID=asdfasfas’
–data-raw ‘{
“name”: “hangc”,
“pwd”: “rwe”
}’

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值