Shell细小问题汇总
Shell细小问题汇总
本文原文出处: http://blog.csdn.net/bluishglc/article/details/44276607 严禁不论什么形式的转载,否则将托付CSDN官方维护权益!
查找特定port执行的进程
# lsof -i TCP:53
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
named 16885 named 20u IPv4 61664 0t0 TCP localhost:domain (LISTEN)
# lsof -i UDP:53
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
named 16885 named 512u IPv4 61663 0t0 UDP localhost:domain
# lsof -i:53
named 16885 named 20u IPv4 61664 0t0 TCP localhost:domain (LISTEN)
named 16885 named 512u IPv4 61663 0t0 UDP localhost:domain
关于lsof的很多其它用法。參考: http://kumu-linux.github.io/blog/2013/04/08/lsof/
使用find查找文件
基本格式:find path expression
1.依照文件名称查找
(1)find / -name httpd.conf #在根文件夹下查找文件httpd.conf,表示在整个硬盘查找
(2)find /etc -name httpd.conf #在/etc文件夹下文件httpd.conf
(3)find /etc -name ‘srm’ #使用通配符*(0或者随意多个)。表示在/etc文件夹下查找文件名称中含有字符串‘srm’的文件
(4)find . -name ‘srm*’ #表示当前文件夹下查找文件名称开头是字符串‘srm’的文件
2.依照文件特征查找
(1)find / -amin -10 # 查找在系统中最后10分钟訪问的文件(access time)
(2)find / -atime -2 # 查找在系统中最后48小时訪问的文件
(3)find / -empty # 查找在系统中为空的文件或者文件夹
(4)find / -group cat # 查找在系统中属于 group为cat的文件
(5)find / -mmin -5 # 查找在系统中最后5分钟里改动过的文件(modify time)
(6)find / -mtime -1 #查找在系统中最后24小时里改动过的文件
(7)find / -user fred #查找在系统中属于fred这个用户的文件
(8)find / -size +10000c #查找出大于10000000字节的文件(c:字节。w:双字。k:KB。M:MB,G:GB)
(9)find / -size -1000k #查找出小于1000KB的文件
3.使用混合查找方式查找文件
參数有: !,-and(-a),-or(-o)。
(1)find /tmp -size +10000c -and -mtime +2 #在/tmp文件夹下查找大于10000字节并在最后
(2)find / -user fred -or -user george #在/文件夹下查找用户是fred或者george的文件文件
(3)find /tmp ! -user panda #在/tmp文件夹中查找全部不属于panda用户的文件
grep查找文件内容
基本格式:grep -r strToFind /target/dir
1.主要參数
-c:仅仅输出匹配行的计数。
-i:不区分大写和小写
-h:查询多文件时不显示文件名称。
-l:查询多文件时仅仅输出包括匹配字符的文件名称。
-n:显示匹配行及行号。
-s:不显示不存在或无匹配文本的错误信息。
-v:显示不包括匹配文本的全部行。
2.pattern正則表達式主要參数:
\: 忽略正則表達式中特殊字符的原有含义。
^:匹配正則表達式的開始行。
$: 匹配正則表達式的结束行。
\<:从匹配正则表达 式的行開始。
>:到匹配正則表達式的行结束。
[ ]:单个字符,如[A]即A符合要求 。
[ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。
.:全部的单个字符。
* :有字符。长度能够为0。
3.实例
(1)grep ‘test’ d* #显示全部以d开头的文件里包括 test的行
(2)grep ‘test’ aa bb cc #显示在aa,bb。cc文件里包括test的行
(3)grep ‘[a-z]{5}’ aa #显示全部包括每行字符串至少有5个连续小写字符的字符串的行
(4)grep magic /usr/src #显示/usr/src文件夹下的文件(不含子文件夹)包括magic的行
(5)grep -r magic /usr/src #显示/usr/src文件夹下的文件(包括子文件夹)包括magic的行
(6)grep -w pattern files :仅仅匹配整个单词,而不是字符串的一部分(如匹配’magic’。而不是’magical’)
if 多条件组合推断演示样例
if [ ! "$STARTUP_TARGET" = "all" -a ! "$STARTUP_TARGET" = "hadoop" -a ! "$STARTUP_TARGET" = "spark" ]
then
echo "STARTUP_TARGET is invalid or not specified!"
exit 1
fi
注意:对于if来说,后面紧跟的“[”实际上是test命令的别名。所以兴许的表达式都是test命令的參数,所以才会须要:
- “[“右側要加一个空格再跟參数
- “=”两側都须要有空格
否则參数就连在了一起。变成了一个參数。
Linux系统时间设置
- 改动时区
非常多系统在安装时没有设置时区,这样非常多系统默认就会使用统一协调时UTC来显示时间。使用date来查看一下输出时间就知道时区和时间是否正确了(假设是UTC表示是统一协调时,非本地时区。假设是CST表示中国标准时间,意味着时区已经正常)。通常。时间不对多是仅仅由于时区问题导致的,所以我们仅仅需改动系统的时区就能够了。方法是把本地(中国上海)的时区文件覆盖到/etc/localtime就可以:
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
2.改动ls -l的时间格式
vim /etc/profile.d/time_style.sh
add
export TIME_STYLE="+%F %T"
在远程节点上推送命令时须要特别注意$!和$?
ssh -T root@hdcoe01<<EOF
su -l hive -c "nohup $HIVE_HOME/bin/hive --service metastore -hiveconf hive.log.file=hive-metastore.log \
-hiveconf hive.log.dir=$HIVE_LOG_DIR>$HIVE_LOG_DIR/hive-metastore.out 2>$HIVE_LOG_DIR/hive-metastore.log &"
su -l hive -c "echo $!|cat>$HIVE_PID_DIR/hive-metastore.pid"
EOF
上述脚本中$!
的值永远是当前主机或者说是本地shell下上一次后台程序的PID,而不可能是前一次推送的hive --service metastore
的PID!
sudo -i和su -l的差异分析
ssh -T root@$NAME_NODE<<EOF
sudo -i -u $HDFS_USER $HADOOP_HOME/bin/hdfs namenode -format -force
EOF
sudo: sorry, you must have a tty to run sudo
此错误须要通过visudo来改动相关配置,若改为:
ssh -T root@$NAME_NODE<<EOF
su -l $HDFS_USER -c "$HADOOP_HOME/bin/hdfs namenode -format -force"
EOF
则没有问题。总结起来:su -l要比sudo -i方便好用!
补充:尽管使用 su非常方便。只是缺点是,当我的主机是多人共管的环境时,假设大家都要使用 su 来切换成为 root 的身份,那么每一个人都得要知道 root 的口令,这样口令太多人知道可能会流出去,非常不妥当呢!
怎办?透过 sudo 来处理就可以!相对于 su 须要了解新切换的用户口令 (经常是须要 root 的口令)。 sudo 的执行则仅须要自己的口令就可以! 甚至能够配置不须要口令就可以执行 sudo 呢!
关于 /var/run和pid
Well since /var/run is mounted as tmpfs. That means it’s totally empty when your machine boots and it’s meant to be like this to prevent stuff like daemons not starting because of a left-over PID-file.
Startup scripts usually create the directories they need before using them. If you want to store a PID-file either put it in /var/run directly or create a directory before creating the PID-file. This is no place to store data that needs to remain there across reboots.
- /var/run是linux约定应用程序存放pid文件的地方(如今大多数系统已经改为了/run,然后把/var/run改为软连接指向了/run),这并不是是一个特殊的文件夹,linux也不会强制应用程序把PID放在这里,仅仅是说这是一个“约定的,默认的”存放PID文件的位置!这个文件夹唯一特殊的地方在于:在当前大多数的Linux系统下,它被挂载为了tmpfs分区。这意味:仅仅要系统重新启动,文件夹内的全部数据都会清空
- 首先我们须要明确:PID文件本身和Linux操作系统没有必定关系,它的产生和使用都是应用程序自已来负责的!一般来说,规范的应用程序在启动时会到指定的文件夹下查找自己的PID文件,假设文件存在说明程序正在执行中,就终止当前的启动程序,并给出提示信息。假设不存在。才继续进行启动。
当程序关闭时,也会自己删除PID文件!当然,以上说的是“规范”的应用程序。有的程序并不一定依照这种规范操作,这就须要详细情况详细分析了。
文件測试參数汇总
字符串測试參数汇总
怎样正确传递数组參数
#!/bin/sh
t()
{
nodeList="$1"
echo ${nodeList[*]}
}
a=(1 2 3)
t ${a[*]}
输出: 1
#!/bin/sh
t()
{
nodeList="$1"
echo ${nodeList[*]}
}
a=(1 2 3)
t "${a[*]}"
输出: 1 2 3
批量改动文件名称
比方:将/etc/yum.repos.d下的CentOS的yum repo文件统一加入bak后缀:
for i in $(ls CentOS-*); do mv $i $i.bak;done
配置163 yum repo的脚本
cd /etc/yum.repos.d
for i in $(ls CentOS-*); do mv $i $i.bak;done
wget http://mirrors.163.com/.help/CentOS6-Base-163.repo
关于”>/dev/null 2>&1”,”>&/dev/null”
id user >&/dev/null
if [$?
!= 0 ]
then
useradd -s /sbin/nologin $user
fi
上面是一段推断用户是否存在,假设不存在就加入用户的脚本,当中>&/dev/null 等同于 >/dev/null 2>&1 而>/dev/null 2>&1又等同于1>/dev/null 2>&1,它们的意思是一样的,即:将标准输出(也就是代表标准输出的文件1)重定向到/dev/null(即不打印标准输出信息),然后把标准错误输出(也就是代表标准错误输出的文件2)合并(也就是&符号的含义)重定向到标准输出,这样,终于达到的效果或者说是目地为:舍弃命令执行中输出的全部信息(不打印不论什么信息)!
在POSIX shell中,命令的结果能够通过%>的形式来定义(当中%表示文件描写叙述符:1为标准输出stdout、2为标准错误stderr)!系统默认%值是1。也就是1>。而1>能够简写为>,也就是默觉得>。
>&/dev/null
这是对 >/dev/null 2>&1
的一个缩写。
标准输入、输出和错误
当我们在shell中执行命令的时候,每一个进程都和三个打开的文件相联系,并使用文件描写叙述符来引用这些文件。
由于文件描写叙述符不easy记忆。 shell同一时候也给出了相应的文件名称。以下就是这些文件描写叙述符及它们通常所相应的文件名称:
文件 | 文件描写叙述符 |
---|---|
输入文件—标准输入 | 0 |
输出文件—标准输出 | 1 |
错误输出文件—标准错误 | 2 |
系统中实际上有12个文件描写叙述符,可是正如我们在上表中所示, 0、1、2是标准输入、
输出和错误。能够随意使用文件描写叙述符3到9。
变量的字符串操作
变量的字符串操作演示样例
file=/dir1/dir2/dir3/my.file.txt
我们能够用${}分别替换获得不同的值:
${file#*/}:拿掉第一条/及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}:拿掉最后一条/及其左边的字符串:my.file.txt
${file#*.}:拿掉第一个. 及其左边的字符串:file.txt
${file##*.}:拿掉最后一个. 及其左边的字符串:txt
${file%/*}:拿掉最后条/及其右边的字符串:/dir1/dir2/dir3
${file%%/*}:拿掉第一条/及其右边的字符串:(空值)
${file%.*}:拿掉最后一个. 及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*}:拿掉第一个. 及其右边的字符串:/dir1/dir2/dir3/my
${file:0:5}:提取最左边的5个字节:/dir1
${file:5:5}:提取第5个字节右边的连续5个字节:/dir2
${file/dir/path}:将第一个dir替换为path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部dir替换为path:/path1/path2/path3/my.file.txt
记忆的方法为:
#是去掉左边(在鉴盘上#在$之左边)
%是去掉右边(在鉴盘上%在$之右边)
单一符号是最小匹配﹔两个符号是最大匹配
后台执行nohup…&
Unix/Linux下一般比方想让某个程序在后台执行。非常多都是使用& 在程序结尾来让程序自己主动执行。
比方我们要执行mysql在后台:
/usr/local/mysql/bin/mysqld_safe –user=mysql &
可是加入我们非常多程序并不象mysqld一样做成守护进程,可能我们的程序仅仅是普通程序而已,一般这种程序使用& 结尾,可是假设终端关闭,那么程序也会被关闭。可是为了能够后台执行。那么我们就能够使用nohup这个命令,比方我们有个test.php须要在后台运 行,而且希望在后台能够定期执行。那么就使用nohup:
nohup /root/test.php &
条件測试:test。[ ]
shell中的測试条件有三种:test。[ ]以及(( ))。当中test和[ ]是等价的。”[“实际上仅仅是test命令的一个别名而已!这也是 [ 之后必须有空格的原因。因此将二者归为一类讨论。
[ ]
[ ]的測试对象有三种:
字符串 ,如[ -z str ]
数字,如[ n1 -lt n2 ]
文件,如[ -f filename ]
[ ]内的变量,最好用双引號包括; 中括号内的常量,最好用单引號或双引號包括,比如
if [ -z ${var} ] #可能出错
if [ -z "${var}" ] #最好改成这样
-a(与)和-o(或):进行多重条件的复合測试。如
if [ -n "${var}" -a "${var}" -lt 100 ] #当变量被定义且其值小于100时
取反測试!:对測试条件取反
if [ ! "$?" -eq "0" ] #上一条命令返回值不等于0
条件測试:(( ))
1.(( ))作測试条件用时当中可使用类C的数字測试条件。包括
< :小于
> :大于
<= :小于等于
>= :大于等于
== :等于
!= :不等于
2.经測试。(( ))中不能用-a。-o以及!等复合測试
3.(( ))除用作数值測试之外,还可用于变量自增减,如(( var++ ))
提前定义的变量
Windows换行符转换
安装dos2unix:
yum -y install dos2unix
将当前文件夹下全部文件从windows换行符转换为unix换行符:
dos2unix -s *
Shell细小问题汇总的更多相关文章
- Shell脚本使用汇总整理
Shell脚本使用汇总整理 一.Shell脚本常用的头部格式: 头部的作用就是告知linux此脚本的类型: 常用的头部格式如下:(/bin/bash,是bash的路径,如果不知道路径可以通过which ...
- Shell脚本使用汇总整理——达梦数据库备份脚本
Shell脚本使用汇总整理——达梦数据库备份脚本 Shell脚本使用的基本知识点汇总详情见连接: https://www.cnblogs.com/lsy-blogs/p/9223477.html 脚本 ...
- Shell脚本使用汇总整理——mysql数据库5.7.8以前备份脚本
Shell脚本使用汇总整理——mysql数据库5.7.8以前备份脚本 Shell脚本使用的基本知识点汇总详情见连接: https://www.cnblogs.com/lsy-blogs/p/92234 ...
- Shell脚本使用汇总整理——mysql数据库5.7.8以后备份脚本
Shell脚本使用汇总整理——mysql数据库5.7.8以后备份脚本 Shell脚本使用的基本知识点汇总详情见连接: https://www.cnblogs.com/lsy-blogs/p/92234 ...
- Shell脚本使用汇总整理——文件夹及子文件备份脚本
Shell脚本使用汇总整理——文件夹及子文件备份脚本 Shell脚本使用的基本知识点汇总详情见连接: https://www.cnblogs.com/lsy-blogs/p/9223477.html ...
- linux shell 常用表达式汇总
1. linux shell 逻辑运算符.逻辑表达式详解: http://www.cnblogs.com/chengmo/archive/2010/10/01/1839942.html
- shell学习笔记汇总
1.shell脚本中函数使用 函数定义在前,调用在后,顺序反了就没有效果了.函数调用为:函数名 参数列表 函数内部通过以下变量访问函数的参数:shell脚本函数中: $0: 这个脚本的名字 $n: 这 ...
- Linux下查看使用的是哪种shell的方法汇总【转】
转自:http://www.jb51.net/LINUXjishu/247797.html 查看当前发行版可以使用的shell 复制代码 代码如下: [root@localhost ~]$ cat / ...
- shell 字符串处理汇总(查找,替换等等)
字符串: 简称“串”.有限字符的序列.数据元素为字符的线性表,是一种数据的逻辑结构.在计算机中可有不同的存储结构.在串上可进行求子串.插入字符.删除字符.置换字符等运算. 字符: 计算机程序设计及操作 ...
随机推荐
- leetcode375 Guess Number Higher or Lower II
思路: dp. https://leetcode.com/problems/guess-number-higher-or-lower-ii/discuss/ 实现: class Solution { ...
- SAS进阶《深入分析SAS》之数据汇总和展现
SAS进阶<深入分析SAS>之数据汇总和展现 1. 通过Print过程制作报表 proc print <data=数据集>; run; 选项: obs=修改观测序号列标签 no ...
- (转)中国电信友华PT921、PT921G光猫设置路由,无线WIFI设置
中国电信友华PT921.PT921G光猫设置路由,无线WIFI设置. 第一步,用管理员帐号密码登陆,打开浏览器,输入http://192.168.1.1 登陆帐号:telecomadmin登陆密码:n ...
- 【C++】智能指针简述(三):scoped_ptr
在介绍scoped_ptr之前,我们先回顾一下前两篇文章的内容. 首先,智能指针采用RAII机制,通过对象来管理指针,构造对象时,完成资源的初始化;析构对象时,对资源进行清理及汕尾. auto_ptr ...
- MySQL——基本安装与使用
基本安装 下载地址:https://dev.mysql.com/downloads/mysql/ 选择解压版本:mysql-5.7.21-winx64.zip 以管理员身份打开cmd(除了安装服务不要 ...
- POJ_1163_The triangle
The Triangle Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 40079 Accepted: 24144 De ...
- 牛客多校Round 10
咕咕咕.... 去烽火台和兵马俑了
- POJ2152 Fire (树形DP)
题意:n个城市n-1条边 组成一棵树 在每个城市修建消防站会有一个花费costi 每个城市能防火当且仅当地图上距离他最近的消防站距离小于di 问如何修建消防站 使地图上所有的城市都有预防火灾的能力 ...
- struts2源码下载链接
http://blog.csdn.net/qq_qun_247286682/article/details/6975298
- How To:分析ORACLE监听日志中的IP信息
有时候需要分析出ORACLE日志监听中的IP信息,分享一个组合命令,Linux的shell下运行正常. grep "HOST=.*establish.*\* 0" listener ...