linux 常用简单命令以及常见问题汇总
2017-12-20 18:42 加个小鸡腿 阅读(357) 评论(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
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.