Linux 学习笔记1

ARM 4浏览

前言

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 环境中的输入输出重定向,用符号<和>来表示。012分别表示标准输入、标准输出和标准错误。

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 55个目录,现在要将3 4 5目录tar打包,12目录不要:
    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"