代码改变世界

linux 常用简单命令以及常见问题汇总

2017-12-20 18:42  加个小鸡腿  阅读(346)  评论(0编辑  收藏  举报

1.ps获取dhcpd进程状态

ps -aux |grep dhcpd |grep -v grep  排除包含grep的那条进程

ps -aux |grep dhcpd |grep -v grep |awk -F " " '{print $2}' 获取进程号

2.执行命令输出在控制台的同时也输出到文件中 ----tee

  有时候,我们不仅想在控制台看到shell脚本或者命令执行的日志,也想将日志输入到文件中处理,此时用tee命令即可。命令: sh test.sh | tee log_tmp

3.grep 完全匹配

(1)头匹配^: grep  -v "^r7.0"

(2)结尾匹配$:grep "r7.0$"

(3)完全匹配:grep "^r7.0$"

(4)完全匹配:grep -w "test" test_file

4.gitk 图形化形式提交

在git bash下执行

 5.sed 替换指定行内容

sed -i "45c versionCode: $versionCode\," test.gradle
sed -i "46c versionName: \"$versionName\"" test.gradle
sed -i "2c VERSION := '$versionCode'" test.txt

6.sz发送文件到本地,rz上传本地文件到linux机器

sz $file_name

参考:https://www.cnblogs.com/wangyuelang0526/p/5057154.html

rz 后会跳出让你选择本地文件的界面,选择好以后就会自动上传到你的linux当前路径,适合文件比较小的上传

7.是否包含某个字符

have_flag=`echo "$string1" |grep "$string2"`   (比如:have_flag=`echo "a,b,c" |grep ","`)

[  "x$have_flag"  == "x"  ] && echo not include

 8.查看centos的版本号:

  cat /etc/redhat-release

9.判断文件夹是否为空

if [  -d $dir  ] && [ "x`ls $dir`"  != "x" ] ;then ..... fi

10.字符串大小写转换

命令:tr/sed/awk

11.ssh连接远程主机执行脚本的环境变量问题

http://www.kuqin.com/shuoit/20141113/343188.html

现象:ssh调用远程脚本,出现环境变量JAVA_HOME失效的问题。

把  ssh root@192.168.1.2 "cd /root/usr/local ; sh test.sh " 修改成:

ssh root@192.168.1.2 ; cd /root/usr/local; sh test.sh ; exit 

12.计算字符串的长度

s_part="abdcd"

length_fit=`echo ${#s_part}`

13.参数过多时数组方式获取


getVarName(){
    vnames=$*
    echo "parameters is ${vnames}"
    declare -A dic
    namesArr=(${vnames//,/ })
    for parameter in ${namesArr[@]}
    do
        nameArr=(${parameter//:/ })
        dic+=([${nameArr[0]}]=${nameArr[1]})
    done
A=${dic["A"]}
B=${dic["B"]}
C=${dic["C"]}
}
getVarName $*
echo A=$A,B=$B,C=$C

14.兼容mac和linux的sed

export xsed=sed #linux

[ "$(uname)" == "Darwin" ] && export xsed=gsed  #mac

xsed -i 's/test/hello/g' test.txt

15.shell函数返回值

1.默认function的返回值包含0 和1,执行成功,返回0,执行失败,返回1,可以采用$?来获取执行结果

2.函数如何返回字符串呢,可以采用echo函数

#!/bin/bash
function test1()
{ 
    echo "test-world"
}
my_str=`test1`
echo my_str=$my_str

命名改脚本为a.sh,执行a.sh,结果显示如下

my_str=test-world

 16.字符串的截取

参考:http://blog.csdn.net/qq_33951180/article/details/68059098

   http://blog.csdn.net/lovemdx/article/details/40513727

          https://www.jb51.net/article/56563.htm

           https://www.cnblogs.com/mianbaoshu/p/12069425.html

  • # 和 ## 号截取字符串(删左边留右边)

${var#*string}    从左边开始,删除第一个string以及左边的所有字符。var为变量名,#表示截取的运算符。

${var##*string}   从左边开始,删除最后一个string以及左边的所有内容。

  • % 和%% 号截取(删右边留左边) 

${var%string*}    从右边开始,删除遇到的第一个string以及右边所有的内容。

${var%%string*}    从右边开始,删除遇到的最后(也就是最左边)一个string以及右边所有内容。

  • 截取指定个数的字符串  

${var:n1:n2}  解释:截取n1和n2之间的字符串  

例如:${var:0:5}表示:从左边第1个字符开始,截取5个字符 

${var:7}表示:从左边第8个字符开始,一直到结束 

${var:0-7:5}表示:从右边第7个字符开始,截取5个字符

${var:0-5}表示:从右边第5个字符开始,一直到变量结束

二、利用cut工具截取

  • -c选项:表示用字符定位

截取第n个字符:之间可以用“,”隔开

截取n1和n2之间的字符:用“-”连接

17.ssh和scp时指定端口

(1)ssh

ssh -p xx $user@ip  

其中xx是端口号,user是用户名,ip是主机ip

比如:ssh -p 23241 root@192.168.1.2

参考:https://blog.csdn.net/z69183787/article/details/76153247 

(2)scp

scp -P xx  upload_file user@ip:$path

其中:-P (大写)后面是端口号,upload_file为需要传送的文件,user是用户名,ip是远端服务器的ip,path是远端路径

比如:scp -P 23231 test1.txt root@192.168.1.2:/usr/test/

参考:https://www.cnblogs.com/jixingke/p/6213074.html

 

18.awk字符串的处理

awk指定输出列:

awk '{print $0} file'    #打印所有列
awk '{print $1}' file #打印第一列 awk '{print $1, $3}' file #打印第一和第三列 cat file | awk '{print $3, $1}' #打印第三列和第一列,注意先后顺序。 cat file | awk '{print $3, $NF}' #打印第三列和最后一列 awk -F ":" '{print $1, $3}' #以“:”为分隔符分割列,然后打印第一列和第三列

$0表示所有列 

-F:指定分隔符

$(NF)表示最后一列,$(NF-1)表示倒数第二列,以此类推。

特殊案例:如果我想打印N列之后的所有列,该怎么办?

解决方法是,把前N列都赋值为空,然后打印所有列。

awk '{for(i=1;i<=N;i++){$i=""}; print $0}' file

19.输入参数的默认值设定${3:-var_d}

今天看到一个不一样的写法:

if [ $# != 2 ] && [ $# != 3 ] ; then #判断参数个数
    echo "Invalid Args"
    echo "Usage:"
    echo "./version.sh Code Name [branch]"
    exit 2
fi

Code=$1
Name=$2
branch=${3:-develop}

首先判断参数个数,如果参数个数既不是两个,也不是三个,就认为是调用脚本的方式有问题,异常退出。“-develop”是默认值的意思,即,如果只输入了两个参数,比如./version 1.1.0 110 那么,第三个参数的值默认为develop,如果输入了三个参数,那么第三个参数的值就是输入的,比如./version 1.1.0 110  master,那么第三个参数就是master

 

20.linux shell cp 隐藏文件或者文件夹

cp -a /home/test/ /root/tmp/
上面的命令是把/home/test/ 这个目录及以下的所有文件都拷贝到/root/tem/下,效果应该是:/root/tmp/test/**** 使用-a参数,可以把隐藏文件也一并复制过去的,这个我试过了,
另外,如果属是cp -a /home/test/* /root/tmp/ 是想把/home/test这个目录下的所有文件复制过去,而不包含目录本身,效果是:/root/tmp/***** 这样的话的确是不能把隐藏文件复制过去,但可以将*换成. 这样写:cp -a /home/test/. /root/tmp 这样就可以把所有的文件都复制过去了

 

21.linux shell 执行curl报错curl: (1) Protocol ftp not supported or disabled in libcurl

在执行curl从ftp下载文件时候报错:curl: (1) Protocol ftp not supported or disabled in libcurl

是采用传参调用脚本的方式,简化脚本up_ftp.sh如下:

#!/bin/sh
ftp_path=$1
curl  -u   al:123456   -o  20201207.apk     $ftp_path

调用方式 sh up_ftp.sh  " ftp://192.168.8.251/output/20201207.apk"

 查了半天也没发现怎么回事,后来发现是ftp路径前面有个空格,所以报错了。

修复优化up_ftp.sh脚本如下:

#!/bin/sh
ftp_path=`echo $1 | sed 's/ /'/g`   #删除参数中的空格
curl  -u   al:123456   -o  20201207.apk     $ftp_path

 

22.shell脚本中多行注释

shell中有时会用到多行注释,一种时vim的快捷方式,我不太熟悉,一种是如下 :<<!   ......!

使用:

:<< !
.......
!

比如:

:<< !
echo ......
echo "......"
echo "tests" >> gradle.properties
!

 

23.linux软链接算文件吗?

假如test.txt是一个软链接文件,可以使用[ -f test.txt ] && echo have test.txt来判断是不是普通文件,其实软链接文件不能说是一个文件,只能算一种符号链接,所以使用“-f ” 来判断文件是不行的,应该使用 “ -L”来判断指定的是否为符号链接,[ -L test.txt ] && echo have test.txt 才能正常输出

参考 if的条件判断如下:

-d :判断指定的是否为目录
-z:判断指定的变量是否存在值
-f:判断指定的是否为文件
-L:判断指定的是否为符号链接
-r:判断指定的是否可读
-w:判断指定的是否可写
-x:判断存在的对象是否可以执行
!:测试条件的否定符号 

 

24.