学习linux很长时间了大概两年前开始接触linux吧,但是总有些时候某某命令很熟悉,可是就是没有熟练应用,导致每次都百度,因为没有笔记,所以回忆起来非常的难,所以这个笔记是非常有必要的。
grep 的基本语法
grep [-avein] '搜索字符串' filename
-a 就是将读取的filename当做文本看待,默认是二进制的
-v 反选,除了选中的
-e 这个就是大名鼎鼎的正则了
-i ignore的缩写,忽略大小写
-n 显示行号
-q 静默模式,不输出
-A 显示匹配的上文信息
-B 显示匹配的下文
-C 显示匹配的上下文
-r 递归查找
----------
Samples
grep -ae 'weixinscan notify param' default_20160120.log |tail -n 1
grep -e "^[a-zA-Z]" filename
#查找某个目录下面所有文件的内容是否包含某些字符串
grep -re "size.*100000" filename
sed的语法
sed [option] [address] command filename
sed 当中几个常用的命令:
- s 替换
- d 删除
- a 追加
- i 插入
- c 修改
sed "s/^/#/" sed2
sed "s/is/[&]/" sed2
sed "s/Jon/Jonathan/" 1.txt
sed "1,3d" 1.txt
sed "5,10! d" 1.txt
sed "/Lane/ d" 1.txt 5.
sed "/^Fred/ s/^/***/" 1.tx
sed "/Jose/ s/^.*$/JOSE HAS RETIRED/" 1.txt
sed "s/[0-9]\/[0-9]\/[0-9]*/11\/14\/46/" 1.txt
sed "/^$/ d" 1.txt
sed -e "1 i PERSONNEL FILE" -e "$ a THE END" -e "/500$/d" -e "s/\([^\-]*\) \([^\-]*\):\(.*\)/\2 \1:\3/" 1.txt
#替换语法
[address]s/pattern/replacement/flags
flags的集中情况:
n 1到512的一个数字
g 和正则的G差不多
p 打印模式空间内容
w file 写入到文件
awk语法
awk '条件类型 1动作 |条件类型 2动作 … ’ filename
cat filename |awk '{print $` "\t" $3}'
cat filename |awk '{print $1 "\t lines:" NR "\t columes:" NF}'
#FS 分隔符 OFS输出分隔符 NR 行号 NF 列数
cat /etc/passwd | awk '{FS=":"} $3 < 10 {print $1 "\t" $3}'
cat /etc/passwd |awk 'BEGIN {FS=":"} $3< 10 {print $1 "\t" $3}'
# RS 行分隔符默认的是\n ORS 输出分行符
#BEGIN和END相当于构造函数和析构函数
cat pay.txt | \
awk 'NR=1 {printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total"}
NR >=2 {total=$2 + $3 + $4
printf "%10s,%10s,%10s,%10s,%10.2f\n",$1,$2,$3,$4,total}'
#这个awk表达式太牛叉了,一直条件然后表达式
awk中的分隔符
#awk中默认是使用空格和指标符来分割的,然而这其实就是类似这样的
FS="[ \t]"
FS="\t"
#表示用一个制表符分割
FS="\t+"
#表示一个或者多个制表符分割,这里使用的就是正则里面的+号
FS="[:;\t]"
#表示可以使用这三种符号来分割行
#突然觉得awk太任性了,怎么可以这样随意分割呢,相比cut方便百倍了
awk中使用正则表达式
awk '{if (/^[^;]/ ) {printf "%s\r\n",$0}}' /usr/lib/php.ini
# 这个例子就是使用正则表达式来匹配php.ini中不是;号开头的行,是不是很爽呢
ll -al |awk '{if (NR!=1 && $3 ~ /lion/) {print $3}}'
#如果awk中某个字段需要使用正则,这个时候使用~后面接正则表达式,这些情况
我们经常会遇到的吧
ll -al |awk '{if (NR!=1 && $3 !~ /lion/) {print $3}}'
#干死tomcat
sudo kill -9 `ps -ef |grep tomcat8.5 |awk '{if (NR == 1) {print $2}}'`
#加一个!感叹号就会成功取反
#简单的cut命令,获取:分割的第二段
cat /etc/passwd |cut -d ":" -f 2
sed -e "/#/d" nginx.conf |tr -s "\n" #查看干干净净的配置文件
#date命令详解
date --date=2016-03-28 +%s #日期转时间戳
date -d @234124214 #时间戳转日期
date -d now +%Y-%m-%d
date -d yesterday +%Y-%m-%d #昨天的时间
date -d tomorrow +%Y-%m-%d #明天的时间
date -d "-3 day" +%Y-%m-%d #前3天
date -d "+3 day" +%Y-%m-%d #后三天
function get_root_line() {
while read line
do
if `echo $line|grep -q "mysql"`; then#判断是否包含了mysql这个字符串
echo $line
fi
done < /etc/passwd
}
function get_root_line() {
local str='helloworld'
echo ${str:1:3}#类似substr的功能
}
function get_root_line() {
local str='helloworld'
echo $str | awk '{if (index($1,"x") > 0) {print "ok"} else {print "fail"}}'#index查找字符串中出现的位置,发现awk很多东西像一门完整的语言了,很厉害的工具
}
function main() {
test_return
if [ $? -eq 0 ]; then #这里判断函数的返回值,特别要注意test结构那些值返回的是真
echo 'ok'
else
echo 'fail'
fi
}
function test_return() {
return -1
}
shell中test结构的误区
if [ 0 ]; then
echo 'ok'#打印ok
if
if [ -1 ]; then
echo 'ok'#打印ok,是不是有点蒙了呢,这他妈的不是-1吗,怎么回事ok呢,事情是这样的大家,test -1肯定是执行成功了,内核在解析shell是肯定也是返回真的
if
#比如我们看下面这段测试
if [ 3 -gt 2 ]; then
echo '肯定ok啦'
if
`#下面来介绍一下shell中坑爹的数组操作咯;首先是申明一个数组
`arr=( bai xiao shi )#看到了吗,居然是括号,php中是array或者[];c语言中是{},然而这还挺新鲜
arr=( one two three four five six )
#打印第一个元素
echo ${arr[0]}
#打印第一个元素
echo ${arr:0}
#打印第一个元素从1开始的偏移量
echo ${arr:1}
#第一个元素的长度
echo ${#arr[0]}
#获取数组的长度
echo ${#arr[*]}
echo ${#arr[@]}
`#下面看看接参数的一些变量
$? #语句执行返回的结果
$# #参数个数
$* #全部参数 "1 2 3"
$@ #分别被引号包住 "1" "2" "3"
$1...$9 #第几个参数
`#继rsync一个好用的命令之外,另外一个命令更加方便在同步文件方面
scp source_file target_file
scp ./array.sh baixs@172.16.173.163:/tmp#将本地的文件复制到远程
scp -r baixs@172.16.173.163:/tmp/array.sh ./ #将远程的文件复制到本地,太方便了我靠
当然如果中间有跳板机的话,还是要xmodel或者是zmodel啊
test语法
参数 说明
-eq 等于则为真
-ne 不等于则为真
-gt 大于则为真
-ge 大于等于则为真
-lt 小于则为真
-le 小于等于则为真
参数 说明
= 等于则为真
!= 不相等则为真
-z 字符串 字符串长度伪则为真
-n 字符串 字符串长度不伪则为真
参数 说明
-e 文件名 如果文件存在则为真
-r 文件名 如果文件存在且可读则为真
-w 文件名 如果文件存在且可写则为真
-x 文件名 如果文件存在且可执行则为真
-s 文件名 如果文件存在且至少有一个字符则为真
-d 文件名 如果文件存在且为目录则为真
-f 文件名 如果文件存在且为普通文件则为真
-c 文件名 如果文件存在且为字符型特殊文件则为真
-b 文件名 如果文件存在且为块特殊文件则为真
cd /bin
if test -e ./bash
then
echo 'The file already exists!'
else
echo 'The file does not exists!'
fi
#查看文件
cat /usr/local/hello.txt
#既查看也输出
cat /usr/local/hello.txt|tee outputfile.out
#xargs的用法
#杀死某个进程的方法,将前面的输出传到 xargs后面的shell命令作为参数
ps -ef |grep logstash|grep -v grep|awk '{print $2}'|xargs sudo kill -9
xargs命令的作用,是将标准输入转为命令行参数。
$ echo "hello world" | xargs echo
#!/bin/bash
APP_PATH=`pwd`
INSTALL="${APP_PATH}/installed"
PACKAGE_NAME="logstash-5.5.0"
TAR_NAME="${PACKAGE_NAME}.tar.gz"
TAR_PATH="${APP_PATH}/src/${TAR_NAME}"
CONFIG_PATH="${APP_PATH}/src/logstash.conf"
function install() {
if [ -e "${APP_PATH}/install.lock" ]; then
echo "logstash installed already, please remove install.lock to reinstall"
exit 1
fi
rm -rf ${INSTALL}
mkdir -p ${INSTALL} && chmod -R 777 ${INSTALL}
cp ${TAR_PATH} ${INSTALL}
cd ${INSTALL} && tar -zxvf ${TAR_NAME} && cp ${CONFIG_PATH} ${INSTALL}/${PACKAGE_NAME}/config/
touch ${APP_PATH}/install.lock
echo -e "install ok !\n please ${APP_PATH}/install.sh --help"
exit 0
}
function check_run() {
pid=`ps -ef |grep logstash|grep -v grep|awk '{print $2}'|xargs`
if [ "$pid" != "" ]; then
echo 1
else
echo 0
fi
}
function start() {
pid=`ps -ef |grep logstash|grep -v grep|awk '{print $2}'|xargs`
if [ "$pid" != "" ]; then
echo "logstash have started, please use restart"
exit 1
fi
nohup ${INSTALL}/${PACKAGE_NAME}/bin/logstash -f ${INSTALL}/${PACKAGE_NAME}/config/logstash.conf 2>&1 &
echo "start ok !"
exit 0
}
function stop() {
`ps -ef |grep logstash|grep -v grep|awk '{print $2}'|xargs kill -9`
}
function usage() {
echo "${APP_PATH}/install.sh options[install|start|stop|restart]"
}
if [[ $# -lt 1 || "$1" == "-h" || "$1" == "--help" ]]; then
usage && exit 1
fi
CMD=$1
shift
case $CMD in
install)
install
;;
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
list)
list_running_task
;;
listall)
list_ini_task
;;
*)
usage
;;
esac
查看文件哪一行数据出现的次数最多
cat num.txt|uniq -c| sort -k1 -nr
#将文件每行统计并逆序排序,看出哪一行出现的次数最多
#查看和修改时间
date "+%Y-%m-%d %H:%M:%S"
date -s "2019-03-01 17:56:16"
#恢复时间
yum install -y ntpdate
&& ntpdate time.nist.gov
&& ntpdate -u pool.ntp.org