shell 入门

切换用户执行sql脚本

使用root用户执行postgresql脚本

su root<< EOFINITDDBDATASU
psql database -f sql/sql_data.sql
EOFINITDDBDATASU

shell中的EOF用法

Shell中通常将EOF与 << 结合使用,表示后续的输入作为子命令或子Shell的输入,直到遇到EOF为止,再返回到主调Shell。可以把EOF替换成其他东西,意思是把内容当作标准输入传给程序。

回顾一下< <的用法。当shell看到< <的时候,它就会知道下一个词是一个分界符。在该分界符以后的内容都被当作输入,直到shell又看到该分界符(位于单独的一行)。这个分界符可以是你所定义的任何字符串

例子:自动登录mysql(root:root,passwd:123456),查询test库,test1表里的user=aa的记录。

复制代码代码如下:

#!/bin/sh
mysql -uroot -p123456 <<EOF
use test;
select * from testaa while a=10000; ###1000 not usr single quote mark,because a is int
# type,only char type need single quote mark.
exit
EOF

用来注释整段脚本代码

特殊用法:

:<< COMMENTBLOCK
   shell脚本代码段
COMMENTBLOCK

用来注释整段脚本代码。 : 是shell中的空语句。

echo start
:<<COMMENTBLOCK
echo
echo "this is a test"
echo
COMMENTBLOCK
echo end

这段脚本执行时,中间部分不会被执行:

复制代码代码示例:

[root@newserver shell]# sh eof.sh
start
end

cat和eof结合使用具有追加功能

使用Cat和EOF多行输入

cat >> /root/test.txt <<EOF 
abcdef 
hello word ! 
FFFFFFFFFFFFFFFFFFFFFFF 
EOF

以上的脚本命令是,在a.txt文件后面加上三行代码。

Ubuntu系统命令

查看系统信息

cat /etc/*release

查看文件大小

ls -ll :以字节B的形式查看文件大小
ls -lh:以直观的形式查看所有文件大小
du -sh: 查看当前文件的总大小

查看当前目录及子目录大小

du -h --max-depth=1 ./

根据端口号查看进程路径

netstat -nlp| grep 80
ps -ef | grep pid

tar 打包并排除某个目录

% tree demo -a
demo
├── .git
│   ├── test1.txt
│   └── test2.txt
└── log
    ├── log1.txt
    └── log2.txt

 

 

备份压缩,并排除.git目录

tar -zcvf demo_2022.tar.gz  --exclude=.git demo

 

解压缩会替换目标目录文件

tar -zxvf demo_2022.tar.gz 

 

证明

rm -rf demo/log/log1.txt
rm -rf demo/.git/test1.txt

% tree demo -a              
demo
├── .git
│   └── test2.txt
└── log
    └── log2.txt

 

 

tar -zxvf demo_2022.tar.gz 

% tree demo -a              
demo
├── .git
│   └── test2.txt
└── log
    ├── log1.txt
    └── log2.txt

Tail、Head

一、从第3000行开始,显示1000行。即显示3000~3999行
cat filename | tail -n +3000 | head -n 1000 
二、显示1000行到3000行
 cat filename| head -n 3000 | tail -n +1000
 注意两种方法的顺序 分解:
tail -n 1000:显示最后1000行
tail -n +1000:从1000行开始显示,显示1000行以后的
head -n -1000:显示前面1000行

find命令

我们经常是用linux下的find命令去查找搜索日志,比如服务器一堆按日期的日历,我要搜索/var/logs/projects的2013年12月的txt日志文件中包含date字符,如下:

find /var/logs/projects/ -name "2013-12-*.txt" | xargs grep 'date'

但是偶尔有些同学划分目录的方式是把日期作为目录,时间作为日志文件名,比如/var/logs/projects/2013-12-12/13-30-00.txt,这样的话如果搜索同样的功能,用上面的命令格式虽然也能搜索,但是不是最快最有效的,如果日志文件非常多非常大,那效率就满多了,研究了一下,用下面的命令能够更快的搜索出来:

find /var/logs/projects/ -regex '/var/log/projects/2013-12-.*/.*.txt' | xargs grep 'date'

查找并删除后缀.pyc文件

find . -name "*.pyc" | xargs rm -rf

文件名+内容

find 文件目录 -type f |xargs grep "查询内容";

时间范围查询

find sessions/ -type f -newermt '03 Feb 2021' ! -newermt '08 Feb 2021' -print | xargs egrep "天气"

 几天内改动过的文件

find . -name "*.h" -mtime -10 -type f -print

grep命令--(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)

  • –e:从文件内容查找与正则表达式匹配的行:
  • –i:查找时不区分大小写:
  • -c:查找匹配的行数
  • –v :从文件内容查找不匹配指定字符串的行
  • -l: 只显示文件名
  • --color=auto: 高亮显示

查找20201118、20201119文件夹下,以prefix为前缀的所有文件,grep 包含“regex”的所有文件名

ls | grep -E "2020111[8-9]" | xargs -i find {} -name "prefix*" | xargs grep -l -E "regex"

##根据时间查找日志

grep '2020-02-27 17:5[6,9]' log.log

##查询指定时间段内的日志

grep -E '2020-02-27 14:5[5-9]|2020-02-28 15:0[0-5]' log.log

##查找关键字

grep -C 10 'aaaa' nohup.out

通过find与grep相结合查找所有子文件中包含timersub关键字的文件

find / -name '*' | xargs grep 'timersub' 

借助grep -r只搜索子目录的内容就能够避免提示(Is a directory)

find / -name '*' | xargs grep -r 'timersub'

搜索某个文件里面是否包含字符串,例如:

grep "search content" filename1

搜索多个文件里面是否包含字符串,例如:

grep "search content" dir

搜索某个目录以及子目录下的所有文件

grep -r "search content" dir

如果需要显示搜索文本在文件中的行数,可以使用参数-n

grep -n "search content" filename1

从文件内容查找不匹配指定字符串的行:

grep –v "被查找的字符串" 文件名

搜索、查找匹配的行数:

grep -c "被查找的字符串" 文件名

如果我们只想获取那些文件包含搜索的内容,那么可以使用下命令

grep -H -r "v\$temp_space_header" /u01/app/oracle/product/11.1.0/dbhome_1/rdbms/admin/ | cut -d: -f1
grep -H -r "v\$temp_space_header" /u01/app/oracle/product/11.1.0/dbhome_1/rdbms/admin/ | cut -d: -f1 | uniq

9:如果只想获取和整个搜索字符匹配的内容,那么可以使用参数w

grep -w "ORA" utlspadv.sql

10: grep命令结合find命令搜索

 find . -name '*.sql' -exec grep -i 'v\$temp_space_header' {} \; -print

sed命令  

  取行。多用于替换。默认会显示文件的全部内容。也可用于查找内容(这个用的比较少)

  格式:sed 参数 匹配行/替换/查找的字符  文件名

  参数:

    -n    取消默认输出。即取消默认显示全部内容,一般与p搭配使用。

    -r    表示支持扩展正则。

    -i    修改文件内容

    eg:

取行

显示test.txt文件第20行到第30行的内容。

sed -n '20,30p'  test.txt 

显示test.txt文件第20行的内容。

sed -n '20p'   test.txt

显示第3行到最后一行。

sed -n '3,$p' test.txt 

插入

如果在某一行匹配到content,就在前面插入两行

sed -i '/content/i\
first row\
second row\
' test.txt

替换

格式:sed -i 's#找谁#替换为什么#g'  test.txt 

sed 's/原字符串/替换字符串/g'

举例:将test.txt文件内的nm全部替换为DDD

 sed  -i  's#nm#DDD#g'  test.txt

找出/data文件夹内所有以.sh结尾的文件,替换所有文件内的abc为kpl.

find /data/ -type f  -name "*.sh" |xargs  sed -i 's#abc#kpl#g'

将第2行的abc替换为123,显示出来。

sed -n '2s#abc#123#gp' test.txt

这里若是加-i的话,则会用处理的结果行替换整个文件的内容,如:

sed -n '2s#abc#123#gp' test.txt  -i   # 则会把第2行中的abc全部替换为123后,清空文件,写入第2行内容

查找

将文件内包含abc的行显示.

sed  -n '/abc/p'   test.txt

将文件内没有包含abc字符的行,均显示出来(这里如果加-n的话就什么都不显示)。

sed '/abc/d'  test.txt

awk     

   取列。取行。计算。

  格式:awk   参数   取行/取列/查找的字符  文件名

  awk  ‘找谁{做什么}’  文件   eg:awk  ‘NR==2{print $3}’  test.txt   取出test.txt文件第2行的第3列内容

  参数:

    -F     指定分隔符(未指定时,默认空格作为分隔符)。 eg:awk  -F ”,“  ‘{print $3}’  test.txt  用逗号作为分隔符,显示第3列

    -F "[ ,]"    指定多个分隔符。   eg:awk  -F "[ ,]"  '{print $3,$5}'  test.txt    用逗号或者空格作为分隔符,显示第3列和第5列

    -F "[ ,]+"   指定多个分隔符。这里的+号表示,以连续出现的空格或逗号作为分隔符。

    $n   第n列

    $0   表示一整行的内容

    NR   表示行号

    {print }   

  取列:

    awk ‘{print $3]’ test.txt   显示第3列

    awk '{print $2,$6}' test.txt    显示第2列,第6列

    awk '{print $2"  ,aa"$4}'  tets.txt    显示第2列,第4列。大括号内,双引号里的内容会原封不动的输出。

  取行:

    awk ‘NR==20,NR==30’  test.txt   显示第20行到第30行

    awk ‘NR==20’  test.txt   显示第20行

  查找:

    awk '/123/'  test.txt   显示文件内包含123字符的行

    awk  ‘!/123/’   test.txt    显示文件内不包含123字符的行

less

  • u (up)向前滚动半页
  • d (down)向后翻半页
  • [pagedown]: 向下翻动一页
  • [pageup]: 向上翻动一页
  • h 显示帮助界面
  • Q 退出less 命令

附加备注

1.全屏导航

  • ctrl + F - 向前移动一屏
  • ctrl + B - 向后移动一屏
  • ctrl + D - 向前移动半屏
  • ctrl + U - 向后移动半屏

2.单行导航

  • j - 向前移动一行
  • k - 向后移动一行

3.其它导航

  • G - 移动到最后一行
  • g - 移动到第一行
  • q / ZZ - 退出 less 命令

4.其它有用的命令

  • v - 使用配置的编辑器编辑当前文件
  • h - 显示 less 的帮助文档
  • &pattern - 仅显示匹配模式的行,而不是整个文件

5.标记导航

当使用 less 查看大文件时,可以在任何一个位置作标记,可以通过命令导航到标有特定标记的文本位置:

  • ma - 使用 a 标记文本的当前位置
  • 'a - 导航到标记 a 处

获取日期

DATE=`date +"%Y%m%d%H%M"`

参考连接

Linux如何搜索查找文件里面内容: https://blog.csdn.net/matthewwu/article/details/86307049

46个Linux面试常见问题送给你:https://www.cnblogs.com/passzhang/p/8552757.html

Linux面试题:https://blog.csdn.net/ThinkWon/article/details/104588679

linux下查找文件及文件内查找内容--find/grep/sed/awk:https://www.cnblogs.com/haocao-niu/p/11618527.html

Ubuntu 常用查找文件与文件内容指令:https://blog.csdn.net/qq_35451572/article/details/81094144

Linux查看文件内容的5种方式:https://blog.csdn.net/pro_fan/article/details/84348793

Linux less命令:https://www.runoob.com/linux/linux-comm-less.html

posted @ 2018-08-20 11:35  逐梦客!  阅读(230)  评论(0)    收藏  举报