linux常用命令及使用方法

1. 截取字符串

(1)、##和%%的使用

	假设我们定义了一个变量为:
	file=/dir1/dir2/dir3/my.file.txt
	可以用${ }分别替换得到不同的值:
	${file#*/}:删掉第一个/及其左边的字符串:	dir1/dir2/dir3/my.file.txt
	${file##*/}:删掉最后一个/及其左边的字符串:my.file.txt
	${file#*.}:删掉第一个.及其左边的字符串:file.txt
	${file##*.}:删掉最后一个.及其左边的字符串:txt
	${file%/*}:删掉最后一个/及其右边的字符串:/dir1/dir2/dir3
	${file%%/*}:删掉第一个/及其右边的字符串:(空值)
	${file%.*}:删掉最后一个.及其右边的字符串:/dir1/dir2/dir3/my.file
	${file%%.*}:删掉第一个.及其右边的字符串:/dir1/dir2/dir3/my
记忆的方法为:
是 去掉左边(键盘上#在 $ 的左边)
%是去掉右边(键盘上% 在$ 的右边)
单一符号是最小匹配;两个符号是最大匹配

(2)、${var:a:b}的使用

${file:0:5}:提取最左边的 5 个字节:/dir1
${file:5:5}:提取第 5 个字节右边的连续5个字节:/dir2

2. ftp、sftp、lftp使用

1、ftp

ftp -n 132.42.49.160 <<EOF
user ftpusr_all ftpusr_all
prompt off
bin
cd /settle01/interface_data/dt_data_bak
lcd $local_home
get $file_pre
close
EOF

2、sftp

sftp ${user_name}@${password}:132.42.49.160 <<EOF
	user ftpusr_all ftpusr_all
	prompt off
	bin
	cd /settle01/interface_data/dt_data_bak
	lcd $local_home
	get $file_pre
	close
	EOF

3、lftp

#!/bin/bash
#用户
USER=xxx
#密码
PASSWORD=xxx
#本机所需下载到的目录名称
dir=abc01
cd ${dir}
#sftp目录(待下载文件目录)
dir=abc
#sftp的IP
IP=192.168.1.66
#端口
#PORT=22
lftp -u ${USER},${PASSWORD} sftp://${IP} << EOF
cd  ${dir}
mget -c *
by
EOF

3. 字符集转换

将GBK转换成UTF-8,在LINIX下执行

   iconv -f GB18030 -t UTF-8 -c  aa.txt -o utf8.txt

4. 输出日志

在计划任务中经常看到,例如:

 */2 * * * * sh /opt/xxxx/test_S1/html/xxxx/test.sh >/dev/null 2>&1
注:
对于& 1 更准确的说应该是文件描述符 1,而1标识标准输出,stdout。
对于2 ,表示标准错误,stderr。
2>&1 的意思就是将标准错误重定向到标准输出。这里标准输出已经重定向到了 /dev/null。那么标准错误也会输出到/dev/null

5. EOF用法

Shell中通常将EOF与 << 结合使用,表示后续的输入作为子命令或子Shell的输入,直到遇到EOF为止,再返回到主调Shell。
可以把EOF替换成其他东西,意思是把内容当作标准输入传给程序。
例子:自动登录mysql(root:root,passwd:123456),查询test库,test1表里的user=aa的记录。

复制代码代码如下:

#!/bin/sh
	mysql -uroot -p123456 <<EOF
	use test;
	select * from testaa while a=10000; ###1000 not usr single quote mark,because a is int
	exit
	EOF

6. awk命令详解

1、Linux以逗号为分隔符,打印文件file.txt中的第一个和第三个字符

awk –F’,’ '{print $1,$3}' file.txt

2、计算多个文件行数

cat *txt |awk -F'€' 'BEGIN{total=0}{total+=$3}END{print total}'

7. rsync命令(断点续传)

rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。

8. dirname $0(取当前路径)

【``】,学名叫“倒引号”, 如果被“倒引号”括起来, 表示里面需要执行的是命令。
比如 dirname $0, 就表示需要执行 dirname $0 这个命令
【“”】 , 被双引号括起来的内容, 里面 出现 $ (美元号: 表示取变量名) (倒引号: 表示执行命令) \(转义号: 表示转义), 其余的才表示字符串。 【’‘】, 被单引号括起来的内容, 里面所有的都表示串, 包括上面所说的 三个特殊字符。 在命令行状态下单纯执行 $ cddirname $0是毫无意义的。因为他返回当前路径的"."。 这个命令写在脚本文件里才有作用,他返回这个脚本文件放置的目录,并可以根据这个目录来定位所要运行程序的相对位置(绝对位置除外)。 $0:当前Shell程序的文件名 dirname $0,获取当前Shell程序的路径 cddirname $0`,进入当前Shell程序的目录
例如:
在/home/admin/test/下新建test.sh内容如下:

cd `dirname $0`
echo `pwd`

然后返回到/home/admin/执行

sh test/test.sh

运行结果:

/home/admin/test

9. if判断语句

(1)基本语法:

if [ command ];then
   符合该条件执行的语句
elif [ command ];then
   符合该条件执行的语句
else
   符合该条件执行的语句
fi

注意:
1、[ ]表示条件测试。注意这里的空格很重要。要注意在’[‘后面和’]'前面都必须要有空格
2、在shell中,then和fi是分开的语句。如果要在同一行里面输入,则需要用分号将他们隔开。
3、注意if判断中对于变量的处理,需要加引号,以免一些不必要的错误。没有加双引号会在一些含空格等的字符串变量判断的时候产生错误。比如[ -n
“$var” ]如果var为空会出错 4、判断是不支持浮点值的
5、如果只单独使用>或者<号,系统会认为是输出或者输入重定向,虽然结果显示正确,但是其实是错误的,因此要对这些符号进行转意
6、在默认中,运行if语句中的命令所产生的错误信息仍然出现在脚本的输出结果中 7、使用-z或者-n来检查长度的时候,没有定义的变量也为0
8、空变量和没有初始化的变量可能会对shell脚本测试产生灾难性的影响,因此在不确定变量的内容的时候,在测试号前使用-n或者-z测试一下
9、? 变量包含了之前执行命令的退出状态(最近完成的前台进程)(可以用于检测退出状态)

(2)一个例子:

#!/bin/sh
SYSTEM=`uname -s` # 获取操作系统类型,我本地是linux
if [ $SYSTEM = "Linux" ] ; then # 如果是linux话输出linux字符串
echo "Linux"
elif [ $SYSTEM = "FreeBSD" ] ; then 
echo "FreeBSD"
elif [ $SYSTEM = "Solaris" ] ; then
echo "Solaris"
else
echo "What?"

fi # 判断结束,以fi结尾 基本上和其他脚本语言一样。没有太大区别。不过值得注意的是。[]里面的条件判断。

注:

IF高级特性: 双圆括号(( )):表示数学表达式
在判断命令中只允许在比较中进行简单的算术操作,而双圆括号提供更多的数学符号,而且在双圆括号里面的’>’,’<'号不需要转意。 双方括号[[ ]]:表示高级字符串处理函数
双方括号中判断命令使用标准的字符串比较,还可以使用匹配模式,从而定义与字符串相匹配的正则表达式。

10. 运算符

说明如下:
1 字符串判断
linux常用命令及使用方法_第1张图片

2 关系运算符
linux常用命令及使用方法_第2张图片

3 文件测试运算符
linux常用命令及使用方法_第3张图片

4 复杂逻辑判断
linux常用命令及使用方法_第4张图片

11. for循环

1、第一类:数字性循环


for1-1.sh

#!/bin/bash 
 
for((i=1;i<=10;i++)); 
do  
echo $(expr $i \* 3 + 1); 
done 

for1-2.sh

#!/bin/bash 
 
for i in $(seq 1 10) 
do  
echo $(expr $i \* 3 + 1); 
done  

for1-3.sh

#!/bin/bash 
 
for i in {1..10} 
do 
echo $(expr $i \* 3 + 1); 
done 

for1-4.sh

#!/bin/bash 
 
awk 'BEGIN{for(i=1; i<=10; i++) print i}'

2、第二类:字符性循环


for2-1.sh

#!/bin/bash 
 
for i in `ls`; 
do  
echo $i is file name\! ; 
done  

for2-2.sh

#!/bin/bash 
 
for i in $* ; 
do 
echo $i is input chart\! ; 
done 

for2-3.sh

#!/bin/bash 
 
for i in f1 f2 f3 ; 
do 
echo $i is appoint ; 
done 

for2-4.sh

#!/bin/bash 
 
list="rootfs usr data data2" 
for i in $list; 
do 
echo $i is appoint ; 
done 

12. while循环

• 标志控制的while循环
示例代码1:
利用while循环计算1到100的和:

#!/bin/bash
i=1
sum=0
while [ $i -le 100 ]
do
  let sum=sum+$i
  let i++
done

• 使用read结合while循环读取文本文件:
结合重定向执行循环:

#!/bin/bash
file=$1                  #将位置参数1的文件名复制给file
if [ $# -lt 1 ];then      #判断用户是否输入了位置参数
  echo "Usage:$0 filepath"
  exit
fi

while read -r line #从file文件中读取文件内容赋值给line(使用参数r会屏蔽文本中的特殊符号,只做输出不做转译)

do
  echo $line        #输出文件内容
done   <  $file

结合cat执行循环:

#!/bin/bash
cat teat.file | while read -r line   #从file文件中读取文件内容赋值给line(使用参数r会屏蔽文本中的特殊符号,只做输出不做转译)
do
  echo $line        #输出文件内容
done   <  $file

13. until循环

until命令和while命令类似,while能实现的脚本until同样也可以实现,但区别是while循环的退出状态是不为0,until退出状态是为0(与while刚好相反),即whie循环在条件为真时继续执行循环而until则在条件为假时执行循环。

#!/bin/bash
i=0
 
until [[ "$i" -gt 5 ]]    #大于5
do
    let "square=i*i"
    echo "$i * $i = $square"
    let "i++"
done

14. 变量自增

shell脚本中的整数型变量,自增有多种实现方式,整体测试脚本如下:

#!/bin/sh
#本脚本测试shell脚本中整型变量自增 加1的几种方法
 
#定义整型变量
a=1
echo $a
 
#第一种整型变量自增方式
a=$(($a+1))
echo $a
 
#第二种整型变量自增方式
a=$[$a+1]
echo $a
 
#第三种整型变量自增方式
a=`expr $a + 1`
echo $a
 
#第四种整型变量自增方式
let a++
echo $a
 
#第五种整型变量自增方式
let a+=1
echo $a
 
#第六种整型变量自增方式
((a++))

15. printf函数

1、左对齐

范例

$ echo "Linux" | awk '{printf "|%-15s|\n",$1}'
|Linux          |

说明:对于echo命令的输出,Linux是经管道发给awk。printf函数包含一个控制串。百分号让printf做好准备,它要打印一个占15个格、向左对齐的字符串,这个字符串夹在两个竖杠之间,并且以换行符结尾。百分号后的短划线表示左对齐。控制串后面跟了一个逗号和$1。printf将根据控制串中的格式说明来格式化字符串Linux。

2、右对齐

范例

$ echo "Linux" | awk '{printf "|%15s|\n",$1}'
|          Linux|

说明:字符串Linux被打印成一个占15 格、向右对齐的字符串,夹在两个竖杠之间,以换行符结尾。

16. 计划调度crontab

crontab的语法格式:

crontab 时间表示

项目 含义 范围
第一个"" 一小时当中的第几分钟(minute) 0~59
第二个"
" 一天当中的第几小时(hour) 0~23
第三个"" 一个月当中的第几天(day) 1~31
第四个"
" 一年当中的第几个月(month) 1~12
第五个"*" 一周当中的星期几(week) 0~7(0和7都代表星期日)

时间特殊符号

特殊符号 含义

*(星号)	代表任何时间。比如第一个"*"就代表一小时种每分钟都执行一次的意思。
,(逗号)	代表不连续的时间。比如"0 8,12,16***命令"就代表在每天的 8 点 0 分、12 点 0 分、16 点 0 分都执行一次命令。
-(中杠)	代表连续的时间范围。比如"0 5 ** 1-6命令",代表在周一到周六的凌晨 5 点 0 分执行命令。
/(正斜线)	代表每隔多久执行一次。比如"*/10****命令",代表每隔 10 分钟就执行一次命令。

常用例子:

时间 含义

*/60 * * * * 每60分钟即每小时执行一次

  • 8 * * * 每日8点执行 45 22 * * * 在 22 点 45 分执行命令 0 17 * * 1 在每周一的 17 点 0 分执行命令 0 5 1,15* * 在每月 1 日和 15 日的凌晨 5 点 0 分执行命令 40 4 * * 1-5 在每周一到周五的凌晨
    4 点 40 分执行命令
    */10 4 * * * 在每天的凌晨 4 点,每隔 10 分钟执行一次命令 0 0 1,15 * 1 在每月 1 日和 15 日,每周一个 0 点 0 分都会执行命令,注意:星期几和几日最好不要同时出现,因为它们定义的都是天,非常容易让管理员混淆

17. 格式化时间

1、格式化时间

	格式化时间 YYYYMMDD:
		date +”%Y%m%d”
		date -d today +"%Y-%m-%d %H:%M:%S"
	取前一个月:
  		date –d ”1 month ago” +%Y%m
	取前一天
		date –d ”1 day ago” +%Y%m%d
	获取时间精确到毫秒
		date +%Y-%m-%d’ ‘%H-%M-%S.%N | cut -b 1-23
	当月第一天
		date +"%Y%m01" 
	当月最后一天
		date -d"$(date -d"1 month" +"%Y%m01") -1 day" +"%Y%m%d" 
	当月最后一天
		date +"%Y%m$(cal|sed 'N;${s/.* //;P;d};D')"

2、获取指定日期前N天的日期

#!/bin/sh
. /etc/profile
 
# 参数:
# args[0] ,数据日期,日期格式yyyy-MM-dd
# 取30天以前的日期
 
function get_date_30daysbefore()
{
 sec=`date -d $1 +%s`
 sec_30daysbefore=$((sec - 86400*30))
 days_before=`date -d @$sec_30daysbefore +%F`
 echo $days_before
}
 
if [ $# == 1 ]; then
 today=$1
 dates_30=`get_date_30daysbefore $1`
else
 today=`date -d -1days '+%Y-%m-%d'`
 dates_30=`date -d -30days '+%Y-%m-%d'`
fi
 
echo $today
echo $dates_30

18. 文件分割

加扩展名的文件分割:

split -b 30m file_info.dat -d -a file_&&ls|grep file_|xargs -nl -i{} mv {} {}.txt

按大小分割文件(30m大小4位数字后缀分割文件)

split -b -d -a 4 30m file_info.dat

按行分割文件(500行大小4位数据后缀分割文件)

split -l 500 -d -a 4 file_info.dat  file_info

参数:

 -l 指定每个小文件行数
 -d 按照数字命名小文件后缀
 -a 后缀位数
  -verbose,显示分割进度

19. vim使用

1、删除列操作

 Ctrl + v ,切换到 VISUAL BLOCK 模式, 按下j(向下)或者k(向上)可以自由按序选中同一列的字符,然后x或者d键均可以删除。

2、删除行

删除第六行:将光标移至要删除的第六行,连续输入两次小写的d,即dd,就可以成功删除第.六行。

3、全局替换(%表示全文)

%s/12/ad/g 把全文所有的12替换成ad

4、vim 到文件开头 结尾

gg:命令将光标移动到文档开头 
G:命令将光标移动到文档末尾

20. 批量解压

  for i in *.zip;do unzip –o $i;done

21. find用法

1、删除三天之前的文件

  find /tmp/ -mtime +3 | xargs rm

2、find统计当前目录下所有txt文件代码行数,过滤了空行

  find . -name "*.txt" |xargs cat|grep -v ^$|wc -l

22. 批量替换

sed -i s/”原密码”/”新密码”/g *.sh
sed -i 's#backup#data#g' *.msg(-i对文件进行操作)

23. 查看8、16进制

查看八进制:cat test.dat|head -1|od -c	
查看十六进制:cat test.dat|head -1|hexdump –C

24. cut用法

(1)其语法格式为:

cut  [-bn] [file]cut [-c] [file]cut [-df] [file]

例子:如果“字节”定位中,我想提取第3,第4、第5和第8个字节

[ro@r po]$ who|cut -b 3-5,8
croe
croe
croe

25. uniq 去重

uniq [-ic]
-i: 忽略大小写字符的不同
-c: 进行计数
cat file_2021012015.list |awk -F '|' '{print $5}'|uniq -c
63 86035
8 22622
1 22642
15 22644
3 22646

26. tee 双重重导向

用法:tee [-a] file
例子:echo "11"|tree data.log

27. sort 排序

sort [-fbMnrtuk] <file_or_stdio>

-r: 忽略大小写
-b: 忽略最前面的空格符
-M: 以月份名称排序
-n:以纯数字方式排序
-r:反向排序
-u:uniq
-t: 分割符, 默认【TAB】
-k: 以那个区间排序

cat file_2021012015.list |awk -F '|' '{print $5}'|uniq -c|sort
12 22625
12 22625

28. 文件解压,压缩

1、gz文件

压缩:

压缩保留源文件的方法:
	gzip –c filename > filename.gz
压缩目录
  gzip -r 目录
  gzip -d  压缩文件

解压:

   gunzip  压缩文件
解压缩保留源文件的方法:
   gunzip –c filename.gz > filename

2. zip文件

1、压缩:

用法 zip [参数] [打包后的文件名] [打包的目录路径] 
## 路径可以是相对路径,也可以是绝对路径

2、解压unzip:

unzip 命令用于解压由zip命令压缩的压缩包文件

语法格式

unzip [ OPTIONS ] file[.zip] [file(s) …] 选项说明
-c #将解压缩的结果输出,并对字符做适当的转换
-f #更新现有的文件
-l #列出压缩文件内所包含的文件
-p #将解压缩的结果显示到屏幕上,但不执行任何的转换
-t #检查压缩文件是否正确;
-u #除了更新现有的文件外,也会将压缩文件中的其他文件解压缩到目录中
-v #显示详细的信息
-z #仅显示压缩文件的备注信息
-a #对文本文件进行必要的字符转换
-b #不对文本文件进行字符转换
-C #压缩文件名称区分大小写
-j #不处理压缩文件中原有的目录路径
-L #将压缩文件中的全部文件名改为小写
-M #将输出结果再交给more程序处理
-n #解压缩时不覆盖原有的文件
-o #unzip执行后覆盖原有的文件,不提示
-P<密码> #使用zip的密码选项
-q #不显示任何命令执行过程信息
-s #将文件名中的空白字符转换为底线字符
-d<目录> #将解压缩后存至指定的目录下
-x<文件> #指定不要处理.zip压缩文件中的哪些文件
-Z #unzip-Z相当于执行zipinfo命令

例子:

如: unzip file.conf.zip -d /data/bak
将file.conf.zip解压到/data/bak 目录下

29. 循环中可并行执行

1、用法

for name in 列表 ;do
  {
  循环体
  }&
done

2、实例

for i in {1 2 3 4 5 6 7 8 9};do
    {
         echo "${i}"
         sleep 5
         echo "${i}_12"
    }&
done

你可能感兴趣的:(linux,shell,linux)