linux 小技巧总结

(1)linux判断文件是否存在

if [ -f filename]; then
      。。。。。。#要执行的语句
 fi

具体例子:

file=/usr/local/oracle/oradata/archived_log/file.txt

 if [ -f $file ];then             #判断文件是否存在,存在就追加
   echo $file_i >> $file
   else                               #否则复写
   echo $file_i > $file
   fi
   fi

(2)按行读取文件

record=/usr/local/oracle/oradata/archived_log/recordarch
file=/usr/local/oracle/oradata/archived_log/file.txt

for file_i in `cat $record`;
do
   echo $file_i
   scp -C  $file_i aaa@192.168.1.106:/d:/redo
   flag=$(echo $?)                         #判断SCP是否发送成功,成功返回0
   if [ $flag -eq 0 ];then
   #rm $file_i
   sed -i '/'''$file_i'''/d' $record
   echo "success delete $file_i"
   if [ -f $file ];then             #判断文件是否存在,存在就追加
   echo $file_i >> $file
   else                               #否则复写
   echo $file_i > $file
   fi
   fi
done

(3)从一个文件夹读取文件

#!/bin/bash
#coding=utf8
record=/usr/local/oracle/oradata/archived_log/recordarch
cd /usr/local/oracle/archive/
for file_i in  `find ./ -mmin -1|grep 'dbf'`;                           #在当前目录下查找包含dbf的在一分钟内生成的文件
do
   #cp $file_i /usr/local/oracle/oradata/archived_log
   file_changed=$(echo $file_i |awk -F '/' '{print $2}')         #去掉./                   awk用法
   echo $file_changed
   echo $file_changed >> $record
done

(4)cut和awk用法,字符串分隔方法。

start_s=$(echo $start | cut -d '.' -f 1)                #以,分割,-f指打印,1指分割后的第一部分

time2=$(echo "$time" | awk '{print $1/1000.0}')

str1=echo $string | cut -d ' ' -f1 #将输入的字符串根据空格分割,取第一个字段(field)

可以打印动态的位置方法:

for((i=1;i<=7;i++)) 

do

echo $user|cut -d ":" -f$i 

done 

将以:分隔的字符串分别输出,这种方法不需要知道个数。

  1. #!/bin/bash  
  2. user=’mark:x:0:0:this is a test user:/var/mark:nologin’  
  3. i=1  
  4. while((1==1))  
  5. do  
  6.         split=`echo $user|cut -d ":" -f$i`  
  7.         if [ "$split" != "" ]  
  8.         then  
  9.                 ((i++))  
  10.                 echo $split  
  11.         else  
  12.                 break  
  13.         fi  
  14. done

问题:对于’1,2,3,4,5’这样的字符串输出采用,分隔开的1 2 3 4 5

特征:在字符串中没有空格

解决方法1

    1. #!/bin/bash  
    2. var=’1,2,3,4,5’  
    3. var=${var//,/ }    #这里是将var中的,替换为空格  
    4. for element in $var   
    5. do  
    6.     echo $element  
    7. done 

(5) 按行读取和按行删除文件

写法一:

----------------------------------------------------------------------------

#!/bin/bash

while read line

do

    echo $line

done < filename(待读取的文件)

----------------------------------------------------------------------------

写法二:

----------------------------------------------------------------------------

#!/bin/bash

cat filename(待读取的文件) | while read line

do

    echo $line

done

----------------------------------------------------------------------------

写法三:

----------------------------------------------------------------------------

for line in `cat filename(待读取的文件)`

do

    echo $line

done

----------------------------------------------------------------------------

说明:

for逐行读和while逐行读是有区别的,如:

$ cat file

1111

2222

3333 4444 555

$ cat file | while read line; do echo $line; done

1111

2222

3333 4444 555

$ for line in $(<file); do echo $line; done

1111

2222

3333

4444

555

shell删除某一行

如果有一个abc.txt文件,内容是:

aaa

bbb

ccc

ddd

eee

fff

如果要删除aaa,那么脚本可以这样写:

sed -i '/aaa/d' abc.txt

如果删除的是一个变量的值,假如变量是var,应该写成:

sed -i '/'"$var"'/d' abc.txt   注意这里是三个'''


至于grep -v aaa abc.txt这个方法,是无法将修改的结果写入abc.txt中去的

(6) 判断一个文件是否存在(重复了,上面有啦)

if [ -f "filename" ];then      #这里的filename可以加上路径

...

fi

将一个文件追加到另一个文件

cat file1 >> file2   #>>追加,>为覆盖

补充例子:

#!/bin/sh
myPath="/var/log/httpd/"
myFile="/var /log/httpd/access.log"
#这里的-x 参数判断$myPath是否存在并且是否具有可执行权限
if [ ! -x "$myPath"]; then
mkdir "$myPath"
fi
#这里的-d 参数判断$myPath是否存在
if [ ! -d "$myPath"]; then
mkdir "$myPath"
fi
#这里的-f参数判断$myFile是否存在
if [ ! -f "$myFile" ]; then
touch "$myFile"
fi
#其他参数还有-n,-n是判断一个变量是否是否有值
if [ ! -n "$myVar" ]; then
echo "$myVar is empty"
exit 0
fi
#两个变量判断是否相等
if [ "$var1" = "$var2" ]; then
echo '$var1 eq $var2'
else
echo '$var1 not eq $var2'
fi

========================================
shell 判断语句

流程控制 "if" 表达式 如果条件为真则执行then后面的部分: if ....; then
....
elif ....; then
....
else
....
fi
大多数情况下,可以使用测试命令来对条件进行测试。比如可以比较字符串、判断文件是否存在及是否可读等等…   通常用" [ ] "来表示条件测试。注意这里的空格很重要。要确保方括号的空格。
[ -f "somefile" ] :判断是否是一个文件
[ -x "/bin/ls" ] :判断/bin/ls是否存在并有可执行权限
[ -n "$var" ] :判断$var变量是否有值
[ "$a" = "$b" ] :判断$a和$b是否相等          -r file     用户可读为真
-w file     用户可写为真
-x file     用户可执行为真
-f file     文件为正规文件为真
-d file     文件为目录为真
-c file     文件为字符特殊文件为真
-b file     文件为块特殊文件为真
-s file     文件大小非0时为真
-t file     当文件描述符(默认为1)指定的设备为终端时为真
######################################################### 含条件选择的shell脚本
    对于不含变量的任务简单shell脚本一般能胜任。但在执行一些决策任务时,就需要包含if/then的条件判断了。shell脚本编程支持此类运算,包 括比较运算、判断文件是否存在等。基本的if条件命令选项有: -eq —比较两个参数是否相等(例如,if [ 2 –eq 5 ])
-ne —比较两个参数是否不相等
-lt —参数1是否小于参数2
-le —参数1是否小于等于参数2
-gt —参数1是否大于参数2
-ge —参数1是否大于等于参数2
-f — 检查某文件是否存在(例如,if [ -f "filename" ])
-d — 检查目录是否存在
几 乎所有的判断都可以用这些比较运算符实现。脚本中常用-f命令选项在执行某一文件之前检查它是否存在。 ################################################################## 判断文件是否存在 #!/bin/sh
today=`date -d yesterday +%y%m%d`
file="apache_$today.tar.gz"
cd /home/chenshuo/shell
if [ -f "$file" ];then
echo "OK"
else
echo "error $file" >error.log
mail -s "fail backup from test" <error.log
fi

原文地址:https://www.cnblogs.com/zmlctt/p/3708150.html