欢迎来到千学网!
您现在的位置:首页 > 实用文 > 其他范文

Shell脚本中使用for循环和cat命令实现按顺序合并文件

时间:2022-05-24 17:05:39 其他范文 收藏本文 下载本文

【导语】这次小编给大家整理了Shell脚本中使用for循环和cat命令实现按顺序合并文件(共9篇),供大家阅读参考,也相信能帮助到您。

Shell脚本中使用for循环和cat命令实现按顺序合并文件

篇1:Shell脚本中使用for循环和cat命令实现按顺序合并文件

这篇文章主要介绍了Shell脚本中使用for循环和cat命令实现按顺序合并文件,本文先是用sed命令来实现,发现不能完成需求,后使用for循环解决,需要的朋友可以参考下

工作目录下面有mydoc1.txt,mydoc2.txt...mydoc41.txt,本来想用sed排列依次取值排序,然后用cat来合并这些文件,发现达不到预期效果,合并令如下所示:

代码如下:

ls -lF *.txt | sed -n ‘/mydoc1/,/mydoc41/p‘ | xargs -i cat {}> >mynew.txt

发现用其命令达不到预期效果,后来经检查发现,问题应该出现在sed排序上面,它仍然是按照位数来进行排序,并没有智能的按照范围来排序,sed取值命令如下:

代码如下:

ls-lF *.txt | sed-n ‘/mydoc1/,/mydoc41/p‘

命令显示结果如下所示:

代码如下:

-rw-r--r-- 1 root root 0 Oct 12 13:38 mydoc10.txt

-rw-r--r-- 1 root root 0 Oct 12 13:38 mydoc11.txt

-rw-r--r-- 1 root root 0 Oct 12 13:38 mydoc12.txt

-rw-r--r-- 1 root root 3 Oct 12 14:48 mydoc13.txt

-rw-r--r-- 1 root root 0 Oct 12 13:38 mydoc14.txt

-rw-r--r-- 1 root root 0 Oct 12 13:38 mydoc15.txt

-rw-r--r-- 1 root root 0 Oct 12 13:38 mydoc16.txt

-rw-r--r-- 1 root root 0 Oct 12 13:38 mydoc17.txt

-rw-r--r-- 1 root root 0 Oct 12 13:38 mydoc18.txt

-rw-r--r-- 1 root root 0 Oct 12 13:38 mydoc19.txt

-rw-r--r-- 1 root root 0 Oct 12 13:38 mydoc1.txt

-rw-r--r-- 1 root root 0 Oct 12 13:38 mydoc20.txt

-rw-r--r-- 1 root root 0 Oct 12 13:38 mydoc21.txt

-rw-r--r-- 1 root root 0 Oct 12 13:38 mydoc22.txt

-rw-r--r-- 1 root root 0 Oct 12 13:38 mydoc23.txt

-rw-r--r-- 1 root root 0 Oct 12 13:38 mydoc24.txt

-rw-r--r-- 1 root root 0 Oct 12 13:38 mydoc25.txt

-rw-r--r-- 1 root root 0 Oct 12 13:38 mydoc26.txt

-rw-r--r-- 1 root root 0 Oct 12 13:38 mydoc27.txt

-rw-r--r-- 1 root root 0 Oct 12 13:38 mydoc28.txt

-rw-r--r-- 1 root root 0 Oct 12 13:38 mydoc29.txt

-rw-r--r-- 1 root root 0 Oct 12 13:38 mydoc2.txt

-rw-r--r-- 1 root root 0 Oct 12 13:38 mydoc30.txt

-rw-r--r-- 1 root root 0 Oct 12 13:38 mydoc31.txt

-rw-r--r-- 1 root root 0 Oct 12 13:38 mydoc32.txt

-rw-r--r-- 1 root root 0 Oct 12 13:38 mydoc33.txt

-rw-r--r-- 1 root root 0 Oct 12 13:38 mydoc34.txt

-rw-r--r-- 1 root root 0 Oct 12 13:38 mydoc35.txt

-rw-r--r-- 1 root root 0 Oct 12 13:38 mydoc36.txt

-rw-r--r-- 1 root root 0 Oct 12 13:38 mydoc37.txt

-rw-r--r-- 1 root root 0 Oct 12 13:38 mydoc38.txt

-rw-r--r-- 1 root root 0 Oct 12 13:38 mydoc39.txt

-rw-r--r-- 1 root root 2 Oct 12 14:48 mydoc3.txt

-rw-r--r-- 1 root root 0 Oct 12 13:38 mydoc40.txt

-rw-r--r-- 1 root root 6 Oct 12 14:48 mydoc41.txt

所以用如下命令来实现需求:命令如下所示:

代码如下:

for ((i=1;i<=41;i++))do echo mydoc$i.txt;done | xargs -i cat {} >> mynew.txt

篇2:Shell中使用scp命令实现文件上传代码

这篇文章主要介绍了Shell中使用scp命令实现文件上传代码,本文讲解使用scp命令实现名登录上传文件,需要的朋友可以参考下

自从法现 SSH 可以执行远端命令后,ftp 软件也渐渐很少用了,

每次更新服务器代码,都要打包、上传、登录到服务器修改文件权限、更新 Cache 等等,又慢又容易出错,所以做成脚本,一次帮我搞定,自己就点上一根烟坐在电脑面前发呆,要么就玩会儿《植物大战僵尸》啥的,悠闲!

PS: Ant 以及 Phing 用户,你们可以无视了… 我只是喜欢玩 Shell 而已。

代码如下:

#!/bin/sh

HOME=‘/cygdrive/d/public_html/myproject‘

## 先打包本地代码

## 排除如下文件: *.svn, *.bat, upload.sh, cache

## 如果需要 exclude 的文件很多,可以使用参数 --exclude-from=FILE

## 将文件一行行写入 FILE 中

cd $HOME

tar jcf tmp.tar.bz2 *  

--exclude=*.bat    

--exclude=*.bz2    

--exclude=*.gz     

--exclude=.svn     

--exclude=cache    

--exclude=upload.sh

## 通过 SCP 上传文件

scp tmp.tar.bz2 user@your.host.com:/home/public_html/myproject/tmp.tar.bz2

## 执行远程 ssh 命令

## 这里执行了另外一个脚本 load.sh

ssh user@your.host.com

cd /home/public_html/myproject

tar jxf tmp.tar.bz2

chown -R web:web *

chmod -R 755 *

sh load.sh

rm -f tmp.tar.bz2

## 删除本地文件

rm -f tmp.tar.bz2

echo “Everything is done.”

# 星期一 一月 11, by Verdana

# vim: set expandtab tabstop=4 shiftwidth=4:

SSH 我配置成了自动登录,可以参考这里,

篇3:巧用DOS命令实现文件合并隐藏秘密

我们都知道DOS命令Copy的主要作用是复制文件,可是你是否知道,它还有一个作用是合并文件呢?

一般情况下,它主要用于合并相同类型的文件,比如将两个文本文件合并为一个文本文件、将两个独立的MPEG视频文件合并为一个连续的视频文件等,那么,如果用它合并两个不同类型的文件,结果会怎样呢?

笔者发现,巧妙地将一个文本文件合并到一个非文本文件中,可以实现隐藏秘密的作用。一起来看看吧。

比如你有一段私人信息要隐藏起来,请先录入并保存为文本文件,假设保存为001.txt。另找一个非文本文件,最好为图片文件或可执行文件。以图片文件为例,假设它的文件名为002.jpg。如果把它们都放到D盘根目录下,那么在Windows的MS-DOS方式下执行以下命令:

d:\Copy 002.jpg/b + 001.txt/a 003.jpg

其中参数/b指定以二进制格式复制、合并文件;参数/a指定以ASCII格式复制、合并文件,

这里要注意文件的顺序,二进制格式的文件应放在加号前,文本格式的文件放在加号后。

执行该命令后,生成了一个新文件003.jpg。回到Windows中用图片浏览软件打开这个它,你会发现它与002.jpg的显示结果一模一样别着急,秘密马上揭晓!用记事本打开003.jpg(在记事本的打开对话框中选择文件类型为所有文件才能打开非TXT文件;或者直接用鼠标把图片拖进记事本窗口),你看到什么了?一堆乱码吗?没错!但如果你按下Ctrl+End键将光标移至文件的尾部,哈,你再看看!是不是001.txt文件中的内容?呵呵,秘密原来在这儿。

按照这种方法,你可以轻松地把一些重要信息隐藏起来,比如用户ID、密码、重要私人信息等。

这个方法的确很巧妙,推荐尝试!哪怕你并不想隐藏什么,它也能带给你一种新奇的感觉。但经过我的验证,有一点要提醒大家:就是这个文本文件的前面最好空上3行以上,这样它头部的内容就不会丢失。

篇4:Shell脚本实现根据文件的修改时间来分类文件

这篇文章主要介绍了Shell脚本实现根据文件的修改时间来分类文件,本文直接给出实现代码,需要的朋友可以参考下

#!/bin/bash# exctute# ./mod.sh file_type input_folder output_folder# ./mod.sh *.txt /tmp /data/# paramater count if [ ! $# -eq 3 ]; then echo “[ERROR] error paramater.” exitfi# file typefile_type=“${1}”# input foloderif [ -d “${2}” ]; then folder=“${2}”else echo “[ERROR] input folder is not exsit.” exit fi# output folderif [ -d “${3}” ]; then utput=“${3}”else echo “[ERROR] output folder is not exsit.” exitfi# search filefind ${folder} -name “${file_type}” | while read filename ; do # file type file_type=`echo ${filename##*.}` # file size file_size=`stat “${filename}” | sed -n ‘2,1p‘ | awk ‘{print $2}‘ ` # file modify time file_modify=`stat “${filename}” | sed -n ‘6,1p‘ | awk ‘{print $2, $3}‘ | sed -e ‘s/[-: ]//g‘ ` # output folder path=“${output}/${file_modify:0:6}” if [ ! -d “${path}” ]; then mkdir -p ${path} echo “folder(${path}) is created . ” fi # new file full name new_file_name=`echo ${path}/${file_modify}_[${file_size}].${file_type}` if [ ! -f “${new_file_name}” ]; then mv “${filename}” “${new_file_name}” else echo “file(${new_file_name}) is exsit, can not be removed. ” fidoneecho “finished !”exit

篇5:Shell脚本实现从文件夹中递归复制文件

这篇文章主要介绍了Shell脚本实现从文件夹中递归复制文件,本文脚本实现从十层左右的文件夹中复制所有文件到一目录中,需要的朋友可以参考下

需求

前两天碰到需要在十层左右的文件夹中提取文件的需求,于是写了此脚本,

如下面这样的文件结构:

代码如下:

dir1

├── a

│  ├── b

│  │  └── file1

│  └── file2

├── c

│  └── d

│      ├── e

│      │  └── file4

│      └── file3

└── file5

我们需要将其中的file1~file5提取出来放到另一个文件夹中。

脚本

脚本getfilefromdir.sh如下:

代码如下:

#!/bin/bash

#desc: get file from directory

#example: sh getfilefromdir.sh A B

INIT_PATH=${1%/}

SAVE_PATH=${2%/}

function checksavepath {

if [ -d $SAVE_PATH ]

then

rm -rf $SAVE_PATH

fi

mkdir ${SAVE_PATH}

touch $SAVE_PATH“.log”

}

function getfilefromdir(){

for file in ` ls $1`

do

if [ -d $1“/”$file ]

then

getfilefromdir $1“/”$file

else

local path=“$1/$file”

local name=$file

if [ ! -f $SAVE_PATH“/”$name ]

then

echo “cp ${path} to ${SAVE_PATH}/${name}”

cp ${path} “${SAVE_PATH}/${name}”

else

echo “${path} file already exists”

echo “${path}” >> $SAVE_PATH“.log” 2>&1

fi

fi

done

}

checksavepath

for sfol in ${INIT_PATH}

do

getfilefromdir ${sfol}

done

运行

代码如下:

sh getfilefromdir.sh dir1/ dir2

第一个参数是源文件夹,第二个是目地文件夹(不需要提前创建),

如果有同名文件,会存在dir2.log中

结果为:

代码如下:

dir2

├── file1

├── file2

├── file3

├── file4

└── file5

篇6:Shell脚本递归打印指定目录中所有目录文件

#!/bin/bash#递归打印当前目录下的所有目录文件,

Shell脚本递归打印指定目录中所有目录文件

。 PRINTF(){ls $1 | while read line#一次读取每一行放到line变量中do [ -d $1/$line ] && { DIR=“$1/$line” echo $DIR} DIR1=`dirname $DIR`#求路径。 A=`ls -F $DIR1 | grep / | grep “<$line>”` #判断line是不是一个目录, if [ “$A” == “$line/” ];then PRINTF “$DIR1/$line”#递归调用。 fidone}PRINTF .#!/bin/bash#这个的实现递归总是无法递归到第一层。 PRINTF(){ ls | while read line do pwd#测试当前路径。 [ -d ./$line ] &&{ echo $line cd ./$line #这里有问题,还没有递归就已经进入下一层了, #所以就出现了我上面的解法。 PRINTF } done}PRINTF

篇7:Shell脚本中实现切换用户并执行命令操作

这篇文章主要介绍了Shell脚本中实现切换用户并执行命令操作,看了示例代码就秒懂了,原来如此简单,需要的朋友可以参考下

今天公司同事来找到我说要在服务器上用另外一个用户执行python脚本,但设置到crontab里却老是root用户来执行,为了省事我就想了一个偷懒的办法,就是用shell脚本切换到那个用户,然后去执行那个python脚本.好了,这篇文章我只演示怎么用shell脚本切换到其他用户执行命令.

系统:centos 5.x

脚本内容:

cat test.sh

代码如下:

#!/bin/bash

su - test <

pwd;

exit;

EOF

执行结果图:

当然也可以用下面的命令来执行

代码如下:

su - test -c “pwd”

ps:

切换用户只执行一条命令的可以用: su - oracle -c command

切换用户执行一个shell文件可以用:su - oracle -s /bin/bash shell.sh

好了,就这样吧.

篇8:Shell脚本实现apache日志中的状态码分析

这篇文章主要介绍了Shell脚本实现apache日志中的状态码分析,本文先是介绍了按天切割日志的方法,然后给出了分析访问状态码的脚本,需要的朋友可以参考下

一、首先将apache日志按天切割

代码如下:

vi /etc/httpd/conf/httpd.conf

ErrorLog “|rotatelogs /var/log/httpd/%Y%m%derror_log 86400 480”

CustomLog “|rotatelogs /var/log/httpd/%Y%m%daccess_log 86400 480” combined

二、重启apache服务

代码如下:

service httpd restart

##################apahce日志服务器按天切割完毕######################

三、分析生成的apache日志状态码(等待了一天的日志)

代码如下:

***日志文件为1228access_log

vi http.sh

#!/bin/bash

total=`cat 20111228access_log|wc -l`

array=(`cat 20111228access_log |awk ‘{print $9}‘|sort|uniq -c|sort -n`)

len=${#array[@]}

echo “####################http状态码统计###########################”

echo “总的连接数:$total”

for ((i=0;i<$len;i=i+2))

{

echo “########################################################”

echo ${array[$i]}:${array[$i+1]}

echo “########################################################”

echo ${array[$i+1]}占连接数的比例是:`awk ‘BEGIN{printf “%.6f%n”,(‘${array[$i]}‘/‘${total}‘*100)}‘`

}

执行脚本结果(以百分号表示):

代码如下:

sh http.sh

####################http状态码统计###########################

总的连接数:688965

########################################################

1:303

########################################################

303占连接数的比例是:0.000145%

########################################################

1:416

########################################################

416占连接数的比例是:0.000145%

########################################################

2:299

########################################################

299占连接数的比例是:0.000290%

########################################################

8:501

########################################################

501占连接数的比例是:0.001161%

########################################################

145:403

########################################################

403占连接数的比例是:0.021046%

########################################################

197:400

########################################################

400占连接数的比例是:0.028594%

########################################################

738:206

########################################################

206占连接数的比例是:0.107117%

########################################################

7307:404

########################################################

404占连接数的比例是:1.060576%

########################################################

9213:302

########################################################

302占连接数的比例是:1.337223%

########################################################

30574:301

########################################################

301占连接数的比例是:4.437671%

########################################################

201197:304

########################################################

304占连接数的比例是:29.202790%

########################################################

439582:200

########################################################

200占连接数的比例是:63.803241%

########################简单讲解#########################

array=(`cat 20111228access_log |awk ‘{print $9}‘|sort|uniq -c|sort -n`)

###这个拿出来是一个数组了

len=${#array[@]}

###这个是数组的长度

echo ${array[$i]}:${array[$i+1]}

###这个是以for循环输入状态码和状态码的连接数

awk ‘BEGIN{printf “%.6f%n”,(‘${array[$i]}‘/‘${total}‘*100)}

###以百分比计算各个状态码大约占的连接数

篇9:linux中php使用root权限执行shell脚本linux操作系统

如果你的apache 用户有root权限那么你的网站如果不安全就有可能很简单的给其它人获取root权限来执行shell命令哦,下面我来给大家演示一下,

今天晚上:19:30分,这个困扰了我好久的问题终于解决,其中的原理也终于弄清楚了,总之是利用sudo来赋予Apache的用户root的执行权限,下面记录一下:

利用php利用root权限执行shell脚本必须进行以下几个步骤:(所有步骤都是我亲自实验,若有不妥可指出,谢谢!)

1. 确定一下你的Apache的执行用户是谁。注:不一定就是nobody,我自行安装的httpd,我的Apache的用户就是daemon

2. 利用visudo为你的Apache执行用户赋予root执行权限,当然还有设置无密码。注:为了安全起见,这里最好是新建一个用户,让他作为Apache的执行用户即可(修改httpd.conf文件,后面我会指出)

3. 这步就简单了,编写你的脚本,利用php的exec,system...函数来执行。

接下来就是详细的实现过程:

1. 查看一下你的Apache的执行用户是谁: lsof -i:80        运行之后的结果为:

从图中我们可以清楚的看到,httpd(也就是Apache)的执行用户为:exec_shell(注:这是我本机上改过之后的用户,只是用来说明一下,你的肯定不是这个!)

确定了你的Linux上Apache的执行者是谁,下面为了安全起见,新建一个用户将Apache的执行用户修改为我们新建的用户。

2. 新建Apache的执行用户

useradd your_exec_user 我们知道创建用户的时候都会默认创建一个用用户名同样的用户组,也就是说现在我们也有一个your_exec_user的用户组

下面我们修改一下Apache的配置文件,使它的执行用户改为我们刚才新建的这个用户your_exec_user :

vi /home/houqingdong/httpd-exe/config/httpd.conf(这个是你的Apache所在的目录位置)

找到下面的地方,修改为你新建的用户:your_exec_user

重新启动Apache:  /home/houqingdong/httpd-exe/bin/apachect1 restart             -------------> 重启完之后你可以利用:lsof -i:80 查看一下。

3. 执行visudo(或者是 vi /etc/sudoers) , 为your_exec_user赋予root权限,并且不需要密码,还有一步重要的修改(我被困扰的就是这个地方)

visudo   找到这个地方,添加your_exec_user,并且设置无需密码

我之前的时候,做完这里就去执行php脚本去了,结果一直创建不成功,而且很郁闷的是我切换到your_exec_user用户下直接执行是可以执行成功的,

后来,查看了一下Apache的日志文件,发现:

这里明显看出,在执行sudo的时候说必须要有一个tty去运行sudo , 知道问题出在哪里问题就好解决了: vi /etc/sudoers  将下面的这句注释掉:

这是因为默认的情况下,执行sudo需要一个终端,这里注释掉就可以了。接下来,写你的shell脚本和php命令吧

4. 这里贴一下我写的很简单的一个脚本,就是利用在php端传来的$directory和$name,在该目录下创建一个$name的目录

#!/bin/bash#Program# This program will execute mkdir: cd $directory ; mkdir $namePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexport PATHcd $1if [ ! -d $2 ]; then mkdir $2else echo “Already exist...” exit 1fi

功能很简单,就是进入到$directory  判断要创建的目录名是否存在, 然后创建该目录 。

构造的php执行函数:(部分)

if(0==“dir”){ $make_dir_command=“/usr/bin/sudo /home/houqingdong/myshell/mkdir.sh /$directory/ $name” ; echo $make_dir_command; exec($make_dir_command,$output,$return); if($return == 0){echo “”; }else{echo “”; }

这里顺带提一句:构造的命令里面最好都使用绝对路径。

5. 在网页端的执行结果:

提交之后,要过几秒中才会弹出执行结果的提示信息:

执行成功,在我们的/home/目录下:

哈哈。。。大功告成!(谢谢存哥的帮助指点!)

Linux文件和目录管理相关命令

Python中使用装饰器和元编程实现结构体类实例

Windwos下使用winscp和批处理实现通过SSH端口上传文件到Linux服务器上

小议在循环经济中的问题和防治

可以在Excel中使用的Office语音识别命令EXCEL基本教程

小学情境作文基础训练——学会按方位变化顺序,有条理地写好处所和游记

小学情境作文基础训练——按发展顺序,围绕中心有详有略地记叙事情

Word中更改自动文件恢复的保存间隔和位置

python实现分析apache和nginx日志文件并输出访客ip列表的方法

网页设计中表格和层排版的使用技巧论文

《Shell脚本中使用for循环和cat命令实现按顺序合并文件(精选9篇).doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式

最新推荐
猜你喜欢
点击下载本文文档