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

篇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脚本递归打印指定目录中所有目录文件
Shell脚本递归打印指定目录中所有目录文件#!/bin/bash#递归打印当前目录下的所有目录文件,
篇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/目录下:
哈哈。。。大功告成!(谢谢存哥的帮助指点!)
★Windwos下使用winscp和批处理实现通过SSH端口上传文件到Linux服务器上
★可以在Excel中使用的Office语音识别命令EXCEL基本教程
★小学情境作文基础训练——学会按方位变化顺序,有条理地写好处所和游记
★小学情境作文基础训练——按发展顺序,围绕中心有详有略地记叙事情
★python实现分析apache和nginx日志文件并输出访客ip列表的方法
文档为doc格式