1.
scp 文件迁移
Remote Server --> Local file
scp -p port user@remoteserverip:/home/user/filename /home/user/filename
各部分含义:
p 为端口参数;
port为具体端口号;
user 为ssh user;
remoteserverip为远程服务器ip或者映射后的域名;
/home/user/filename 为远程服务器的文件名;
/home/user/filename 为本地服务服务器的文件名。
该命令的作用就是将远程的filename复制到本地对应的目录下面。
如果报错:not a regular file,请加上-r参数。
options
-r 递归复制
-l user 指定用户名
-pw 显示的输入用户密码
Local file --> Remote Server
用法:
scp local_file remote_username@remote_ip(or domain name):remote_folder
使用域名的例子如下:
scp /home/root/davidTmp/output2.csv root@vm008:/root
2.
tail 文件查看
从指定点开始将文件写到标准输出。
使用tail命令的-f选项可以方便的查阅正在改变的日志文件,
tail -f filename会把filename里最尾部的内容显示在屏幕上,并且不但刷新,使你看到最新的文件内容。
tail -n 20 test.log //查看倒数20行的信息
tail -n +20 test.log //查看20行以后的信息
tail -f test.log //刷新文件尾部内容
3.
ps aux | grep some_process_name
查看目前运行的所有进程。
1)ps a 显示现行终端机下的所有程序,包括其他用户的程序。
2)ps -A 显示所有程序。
3)ps c 列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示。
4)ps -e 此参数的效果和指定"A"参数相同。
5)ps e 列出程序时,显示每个程序所使用的环境变量。
6)ps f 用ASCII字符显示树状结构,表达程序间的相互关系。
7)ps -H 显示树状结构,表示程序间的相互关系。
8)ps -N 显示所有的程序,除了执行ps指令终端机下的程序之外。
9)ps s 采用程序信号的格式显示程序状况。
10)ps S 列出程序时,包括已中断的子程序资料。
11)ps -t 指定终端机编号,并列出属于该终端机的程序的状况。
12)ps u 以用户为主的格式来显示程序状况。
13)ps x 显示所有程序,不以终端机来区分。
找到进程:
ps aux | grep java
杀死进程:
kill -9 pid
4.
lsof
[转] http://blog.youkuaiyun.com/wyzxg/article/details/4971843 --linux删除文件后没有释放空间
lsof全名list opened files,也就是列举系统中已经被打开的文件。我们都知道,linux环境中,任何事物都是文件,
设备是文件,目录是文件,甚至sockets也是文件。所以,用好lsof命令,对日常的linux管理非常有帮助。
5.
chown、chgrp
修改文件或目录所属用户、所属组
使用chown命令可以修改文件或目录所属的用户:
命令:chown 用户 目录或文件名
例如:chown david /home/liuwei (把home目录下的liuwei目录的拥有者改为david用户)
使用chgrp命令可以修改文件或目录所属的组:
命令:chgrp 组 目录或文件名
例如:chgrp superuser /home/liuwei (把home目录下的liuwei目录的所属组改为superuser组)
6.
xargs与管道符综合实例
A) 删除除指定文件之外的所有其他文件(含文件/目录)
ls|grep -v cep_compute.tar.gz|xargs rm -rf
B) 杀掉Hello java进程
jps -l|grep HelloExecutor|awk '{print $1}'|xargs kill -9
C) 杀掉运行中的sh脚步
#匹配任意空格: \ *
#匹配任意字符: .*
kill -9 $(ps -ef|grep "sh\ *.*start_new.sh\ *main"|grep -v grep|awk '{print $2}')
7.
-e -f -d ne lt
文件比较运算符
-e filename 如果 filename存在,则为真 [ -e /var/log/syslog ]
-d filename 如果 filename为目录,则为真 [ -d /tmp/mydir ]
-f filename 如果 filename为常规文件,则为真 [ -f /usr/bin/grep ]
-L filename 如果 filename为符号链接,则为真 [ -L /usr/bin/grep ]
-r filename 如果 filename可读,则为真 [ -r /var/log/syslog ]
-w filename 如果 filename可写,则为真 [ -w /var/mytmp.txt ]
-x filename 如果 filename可执行,则为真 [ -L /usr/bin/grep ]
filename1-nt filename2 如果 filename1比 filename2新,则为真 [ /tmp/install/etc/services -nt /etc/services ]
filename1-ot filename2 如果 filename1比 filename2旧,则为真 [ /boot/bzImage -ot arch/i386/boot/bzImage ]
字符串比较运算符 (请注意引号的使用,这是防止空格扰乱代码的好方法)
-z string 如果 string长度为零,则为真 [ -z "$myvar" ]
-n string 如果 string长度非零,则为真 [ -n "$myvar" ]
string1= string2 如果 string1与 string2相同,则为真 [ "$myvar" = "one two three" ]
string1!= string2 如果 string1与 string2不同,则为真 [ "$myvar" != "one two three" ]
算术比较运算符
num1-eq num2 等于 [ 3 -eq $mynum ]
num1-ne num2 不等于 [ 3 -ne $mynum ]
num1-lt num2 小于 [ 3 -lt $mynum ]
num1-le num2 小于或等于 [ 3 -le $mynum ]
num1-gt num2 大于 [ 3 -gt $mynum ]
num1-ge num2 大于或等于 [ 3 -ge $mynum ]
8.
获取随机数
function rand(){
min=$1
((max=$2-$1))
num=$(date +%s%N)
retnum=$(($num%$max + $min))
echo $retnum
}
9.
随机获取文本中一行
process_to_be_kill=`shuf -n1 pid`
kill -9 $process_to_be_kill
10.
删除文本中指定的一行
sed -i "/${process_to_be_kill}/d" pid
11.
变量赋值
let mod_number=random_number%2
retnum=$(($num%$max + $min))
12.
综合案例
如果进程数大于某个预设值,则随机将一个进程杀死,如果小于该值,则启动java进程
function start_process(){
process_cnt=`cat pid | wc -l`
echo 'process_cnt='$process_cnt
if [ $process_cnt -ge $concurrent_cnt ];then
process_to_be_kill=`shuf -n1 pid`
echo 'process_to_be_kill='$process_to_be_kill
kill -9 $process_to_be_kill
sed -i "/${process_to_be_kill}/d" pid
else
random_number=$(rand 1 100)
echo 'random_number=============='$random_number
let mod_number=random_number%2
echo 'mod_number='$mod_number
if [ $mod_number -eq 1 ];then
echo 'Random number is odd, will start new handler.'
nohup java -Xms70g -Xmx120g -XX:-UseGCOverheadLimit -Dproject.configuration=$dir/app.properties -Dlog4j.configuration=file:$dir/log4j.properties -cp /opt/spark-2.4.0-cdh6.1.0/conf/:/opt/spark-2.4.0-cdh6.1.0/jars/*:/opt/spark-2.4.0-cdh6.1.0/jars/../hive/*:$dir/cep-order-1.0-SNAPSHOT-jar-with-dependencies.jar org.apache.spark.executor.HelloExecutor $dir/meta/data > /dev/null 2>&1 &
echo $! >> pid
else
echo 'Random number is even, will kill one handler randomly'
process_to_be_kill=`shuf -n1 pid`
kill -9 $process_to_be_kill
sed -i "/${process_to_be_kill}/d" pid
fi
fi
}
13.
循环执行某项操作
function main_process(){
while true
do
start_process
random_number=$(rand $run_min $run_max)
echo 'Current time is '$(date '+%Y-%m-%d %H:%M:%S')', System will sleep for '${random_number}' seconds'
sleep $random_number
done
}
14.
在多个文件中查找符合某个特征的文件
ls lib/* | while read line; do jar -tf $line|grep ${SPECIFIC_FEATURE}; echo $line; done
#查找并判断文件类型是否为文件,是则清空:
ls|while read l;do if [ -f $l ];then cat /dev/null > $l;fi done
15.
获取文件当前路径
curr_dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
16.
从文件中循环读取一行文本
while read line; do done; < file
案例:
读取文件中server中ip地址,批量将jar包上传上去:
while read IP; do scp -P 22 /home/david/deploy/file_transfer_station/* david@$IP:~ ; done < dw_servers
17.
清空文件
方法1:cat /dev/null > ${FILE_NAME}
方法2:> ${FILE_NAME}
18.
sed替换指定string内容
场景1:替换不带路径的字符串
sed -i "s/address:.*/address: $ip/g" ${SPRINGBOOT_APP_PATH}/config/application-peer1.yml (将address: 后的ip替换为新的ip)
场景2:替换带路径的字符串
sed -i "s:/aaa/bbb:${NEW_PATH}:" test.yml
注意:
a)、":"为新的分隔符,为非默认的"/";
b)、当替换的字符串为使用"$"符号的变量时,-i后的参数需整体用 双引号(" ~ ") 包起来,如果使用单引号(' ~ '),则变量不会被替换。
场景3:为第n行插入指定String
语法:
sed -i "第几行i\需要添加的内容" $RawFileName
样例,在文件f的第一行插入指定的文件内容:
sed -i "1i\\$(cat user_header.txt)" $f
检查是否插入:
sed -n '1,1p' yourfile
19.
vim s替换指令
:s/helllo/sky/ 替换当前行第一个hello为sky
:s/helllo/sky/g 替换当前行的所有hello为sky
:n,$s/hello/sky 替换第n行开始到最后一行的第一个hello为sky
:n,$s/hello/sky/g 替换第n行开始到最后一行的所有hello为sky
:%s/hello/sky 替换每一行的第一个hello为sky
:%s/hello/sky/g 替换每一行的所有hello为sky
20.
vim 中【将第3~最后一行】的空格(包括空格,\t,^M)替换为空
:3,$s/[[:space:]]*//g