前言
Linux Shell 命令,学习笔记的知识点汇总,以备日后忘记。
Linux 命令知识点
// 查找当前文件夹下大于100M的文件
find ./ -type f -size +100k # 列出文件名
find ./ -type f -size +100k -print0| xargs -0 du -h # 列出文件名和文件大小
find ./ -type f -size +100k -print0| xargs -0 du -h|sort -nr # 进行降序排序
// 查找linux 下的大目录:经常的磁盘空间告警,用于检测文件大小
du -h --max-depth=1|sort -nr
du -hm --max-depth=2 | sort -nr |head -10 # 前10个最大的文件
// 显示一个文本的前3行
方式一:
sed -n '1,3p' capacity_chart.txt
方式二:
head -3 capacity_chart.txt
// linux下查看末尾10条数据,开始10条数据。
cat -n test.data|tail -n 10|head -n 10
tail -n 1000:显示最后1000行
tail -n +1000:从1000行开始显示,显示1000行以后的
head -n 1000:显示前面1000行 head -n 1 test.data 查看第一行数据
// Linux系统下安装rz/sz命令及使用说明
功能:将本地的文件上传到服务器或者从服务器上下载文件到本地
sz命令发送test.data文件到本地:sz test.data
rz命令本地上传文件到服务器:rz
// linux service … start
关于service命令:
http://blog.csdn.net/zhq651/article/details/8557275
示例:
service oracle start
service oracle stop
service oracle restart
service oracle status
// linux查看程序的运行时间
time命令
time ls -lh
// 根据程序的PID,来查看运行程序的路径
ls -l /proc/18237
// 监控一个udp传输数据的端口
nc -ul 514
// netstat 端口相关命令
查看端口占用
netstat -aon|findstr 9050
查看一个端口的连接数
netstat -aon|grep -i "4242"|wc -l
根据端口号找pid
netstat -apn | grep 5601
列出被占用的端口
netstat -anp|grep LIST
列出被python占用的端口号
netstat -anlp | grep python
参看端口号是否被占用
netstat -a -t --numeric-ports -p
lsof -i tcp:port(port替换成端口号,比如6379)可以查看该端口被什么程序占用,并显示PID,方便KILL
详细可参考:http://boy-liguang.blog.sohu.com/187052443.html
// 怎么样在Linux编程中查看某个指定的程序是否在运行
* 比如进程名叫sumo,可以执行如下命令:ps -ef | grep sumo,如果有内容说明活着
* 如果你知道进程占用的端口号,比如7777,可以执行:netstat -anp | grep 7777,检查有没有程序占用该端口,若有的话,看pid或pname是否是你想要找的
* 如果想要找的是某个服务,比如nfs、smb等,可以用service nfs status查看
// 关于 nohup 和 & 命令,后台进程命令
nohup ./program &
程序的标准输出被自动改向到当前目录下的nohup.out文件,起到了log的作用。
参考:http://www.cnblogs.com/allenblogs/archive/2011/05/19/2051136.html
// 标准输出、错误输出重定向
Linux Shell 环境中的输入输出重定向,用符号<和>来表示。0、1和2分别表示标准输入、标准输出和标准错误。
nohup ./program>/dev/null 2>out.log & # 只输出错误信息
nohup ./program & # 打印正常输出和错误输出
nohup ./program >out.log 2>&1 & # 打印正常输出和错误输出
参考:http://blog.chinaunix.net/uid-21142030-id-3211182.html
http://www.cppblog.com/Error/articles/195997.html
// 秘钥权限设置
chmod 700 ~/.ssh
chmod 644 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/id_rsa
// 登入 Master 节点。將Master上的公钥传送到所有其他nodes
ssh-copy-id -i ~/.ssh/id_rsa.pub hduser@slave1-hadoop
ssh-copy-id -i ~/.ssh/id_rsa.pub hduser@slave2-hadoop
// 权限管理
命令:chown xyd:localized /home/xyd/xx/app.conf
赋权限,用户名:组名
// linux PATH中环境变量管理
删除环境变量:unset PATH
添加环境变量:
HADOOP_HOME=/home/dig/xyd/hadoop-2.6.4/
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
用户级别环境变量:vi ~/.bash_profile
系统级别环境变量:vi /etc/profile
http://www.cnblogs.com/bionmr/p/4149527.html
// 从远程拷贝、以及拷贝到远程
scp -r root@180.76.185.216:/ex-home/ghk/pycharm_project/qdb ~/
scp -r /Users/haizhi/test.sh root@180.76.166.23:/home/dig
// 创建软链
ln -s /Users/hz/tmp/dsjjc/dist/ static
// 文件查找
find / -name elasticsearch.yml
// 关于防火墙
systemctl start firewalld.service
systemctl stop firewalld.service
firewall-cmd --permanent --add-port=50070/tcp
firewall-cmd --reload
firewall-cmd --list-all
firewall-cmd --state
linux 用户添加
groupadd hadoop #添加一个叫hadoop的用户组
useradd hduser -g hadoop -d /home/hduser #添加一个用户目录
vim /etc/sudoers #编辑sudoers文件,给hadoop用户sudo权限
hduser ALL=(ALL) ALL #在sudoers尾部加上这一行
passwd hduser
ls命令小结
ls可以一次性显示多个目录
查看隐藏文件:ls -a
查看文件大小:ls -lh
支持通配符:ls *.sh
Shell 脚本知识点
// linux中shell变量$#,$@,$0,$1,$2的含义解释
$$:Shell本身的PID(ProcessID)
$!:Shell最后运行的后台Process的PID
$?:最后运行的命令的结束代码(返回值)
$-:使用Set命令设定的Flag一览
$*:所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$@ 所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$#:添加到Shell的参数个数
$0:Shell本身的文件名
$1~$n:添加到Shell的各参数值。$1是第1参数、$2是第2参数…。
示例:显示当前脚本或命令的名字
echo `basename $0`
// 获取当前路径
homepath=`pwd`
echo $homepath
// shell下隐藏文件操作
查找隐藏文件
find /opt/bre/bre/zhiheng.jiang/venice_v2/ -name ".?*"
会把一个目录下的隐藏目录中的非隐藏文件也给找出来
find /opt/bre/bre/zhiheng.jiang/venice_v2/ ! -name ".?*"
// cat 重定向
cat 1.txt //查看1.txt内容
cat > 2.txt //创建2.txt,并输入内容
cat 1.txt 2.txt > 3.txt // 把1.txt 和2.txt 的内容输出写到3.txt 的末尾
cat 1.txt 2.txt | sort -u > 3.txt //去重排序
// shell 中的>>和>
>> ;如果文件不存在,将创建新的文件,并将数据送至此文件;如果文件存在,则将数据添加在文件后面
> ;如果文件不存在,同上,如果文件存在,先将文件清空,然后将数据填入此文件
// 压缩和解压-tar命令
tar -zcvf test.tar.gz /xyd
tar -zcvf a.tar.gz a.txt
tar -zxf a*.tar.gz # 不支持批量解压
假设 test目录下有 1 2 3 4 5 这5个目录,现在要将3 4 5目录tar打包,1和2目录不要:
tar -zcvf test.tar.gz –exclude=1 –exclude=2 test
// shell 脚本运行python命令
sys.argv[0] 表示脚本名称
python.py中写法:
item_num = int(sys.argv[1])
all_items = int(sys.argv[2])
filter_two = int(sys.argv[3])
top_num = int(sys.argv[4])
.sh文件写法:
item_num=2
all_items=215297
filter_two=1
top_num=100
python item_res.py $item_num $all_items $filter_two $top_num
运行.sh文件
sh 文件名.sh
// hive 申明int变量
declare -i day_end=$day+20
// 有如下日期操作,相对日期加减
echo `date +%Y-%m-%d`
date=`date -d '-1 days' +%Y-%m-%d`
date_1=`date -d "$date -1 days" +%Y-%m-%d`
// mysql调用,输入重定向
mysql_host="192.168.61.73"
mysql_port="9000"
mysql_user="xxx"
mysql_pswd="qfd"
mysql -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_pswd < $tmp_file_sql
其中$tmp_file_sql文件的代码如下:
use dp; load data local infile './report.txt' into table TB_N ( level1,level2,level3,level4,level5);
// shell 参数调用,showRes一定要先定义
function showRes(){
a=`hadoop fs -cat ${1}/part-r-* | wc -l`
b=`hadoop fs -cat ${2}/${3}.dat | grep ${4} | wc -l`
echo "$date ${4}类型覆盖度:$a/$b"
}
showRes $output $input $date ck:
// 判断文件是否存在
date=`date -d "-$day days" +%Y-%m-%d`
outPutPath=/warehouse/up.db/blackhole_user_basic_info/l_date=$date
hadoop fs -test -e $outPutPath
if [ $? -eq 0 ];then
echo "=======退出======="
exit 0
echo "=======退出循环======="
continue
fi
#ne是不等于,eq是等于
使用方法:hadoop fs -test -[ezd] URI
-e 检查文件是否存在。如果存在则返回0。
-z 检查文件是否是0字节。如果是则返回0。
-d 如果路径是个目录,则返回1,否则返回0。
// 判断文件是否存在
if [ -f sedTest.conf ]; then
echo "File exists!"
else
echo "File not exist!"
fi
// AWK命令
AWK是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。-F表示分隔符。
cat FileName | awk -F ':' '{print $1,$2}'
cat FileName | awk -F '\t' '{print $1}' > NewFileName
// wget命令下载
un="user"
pw="password"
wget "http://iptools.api.bfd.com/download/test.txt?username=${un}&password=${pw}" -o get2.log -O test.dat
http://blog.csdn.net/endall/article/details/1571220
http://www.cnblogs.com/peida/archive/2013/03/18/2965369.html
// ftp下载文件
例1:
lftp ftps://GDF_BDMS:ms9CxVUfMhs=@192.168.49.48 -e "cd /up_dm_hbase2es; put Test.java; quit;"
例2:
path="/opt/bre/bre/xxx.txt"
lftp ftps://GDF_BDMS:ms9CxVUfMhs=@192.168.49.48 -e "cd /venice; put ${path}/input_sample.txt; quit;"
例3:
lftp ftps://GDF_BDMS:ms9CxVUfMhs=@117.121.7.29 # 在linux下进入,ftp站点
ls #查看ftp站点文件,还可以 cd rule/
put create_rule.py #从linux下载数据到ftp上
get 1073.txt #把ftp站点数据上传到linux
quit 退出ftp链接
// ftp上传文件
path="/opt/bre/bre/xyd/check"
lftp ftps://GDF_BDMS:ms9CxVUfMhs=@192.168.49.48 -e "cd /; get ecmedia2.txt -o ${path}/ecmedia3.txt; quit;"
// 关于循环和日期变量参数传递
for (( d=1; d<=253; d++))
do
date=`date -d "-${d} days" +%Y-%m-%d`
done
// 数组循环
INDEX=("1073" "1080" "1102")
len=${#INDEX[@]}
echo "len: "${len}
for((i=0;i<len;++i))
do
、、、、
done
// shell 中 if then语句中会跟着-ne -ge之类的语句
if [ 1 -ne 1 ];then ...
这是指当1不等于1时执行then后的语句
-eq:等于
-ne:不等于
-le:小于等于
-ge:大于等于
-lt:小于
-gt:大于
// shell脚本中,双引号之间不能有双引号,只能有单引号
正确写法:date=`date -d '-1 days' +%Y-%m-%d`
错误写法:date=`date -d "-1 days" +%Y-%m-%d`
错误如下:
date=`date -d "-1 days" +%Y-%m-%d`
hql="select concat('ck:',gid) as gid,method,concat(customer,'+',iid) as cust_item,
unix_timestamp(concat('${date}',' 23:59:59')) as time_stamp
from Table_Name where l_date='${date}' limit 100 "
hive -e "$hql"