分页: 1 / 1

for循环如何处理文本

发表于 : 2010-09-08 23:38
sai9924
root@linux:[/etc/shell]cat list.txt
sep 8 23:26:58 mx2 sshd(pam_unix)[23164]: authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=203.86.48.53
Sep 8 23:27:00 mx2 sshd(pam_unix)[23169]: check pass; user unknown
Sep 8 23:27:00 mx2 sshd(pam_unix)[23169]: authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=203.86.48.53
Sep 8 23:27:03 mx2 sshd(pam_unix)[23172]: check pass; user unknown
Sep 8 23:27:03 mx2 sshd(pam_unix)[23172]: authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=203.86.48.53
Sep 8 23:27:05 mx2 sshd(pam_unix)[23175]: check pass; user unknown
Sep 8 23:27:05 mx2 sshd(pam_unix)[23175]: authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=203.86.48.53
大概这种内容的文本数据很长,用for循环然后做文字筛选,但是for循环后面的参数要加引号才能区分空格
#!/bin/bash
a=`cat list.txt `
for r in $a
do
# echo "`echo $r |grep 203.86.48.53 |sed 's/host/ip/'`"
echo $r
done
类似这种脚本 想对$r做文字处理,但是这样写的话把list.txt文本里的空格区作为一个参数,应该怎么做才能按照文本原样的行来处理??
sep
8
23:26:58
mx2
sshd(pam_unix)[23164]:
authentication
failure;
logname=
uid=0
euid=0
tty=ssh
ruser=
rhost=203.86.48.53
Sep
8
23:27:00
mx2
sshd(pam_unix)[23169]:
check
pass;
user
unknown
Sep
8
运行脚本的结果是这样的。都用空格区分了,文本太长又不能贴在变量里用“”,老大指示了必须用for写怎么做呢??大家帮帮忙

Re: for循环如何处理文本

发表于 : 2010-09-09 5:51
aerofox

代码: 全选

while read r; do 
     echo "$r"
done < list.txt
看看你想干什么,也许根本不需要用 shell 循环控制。

Re: for循环如何处理文本

发表于 : 2010-09-09 12:31
sai9924
如果一定要用for应该怎么做呢??

Re: for循环如何处理文本

发表于 : 2010-09-09 12:38
sai9924
要做的是用for筛选处理文本每一行的内容,然后显示处理后每一行的结果。
但是文本中有空格,无法把一整行进行处理,应该怎么用for做??

for r in "文本内容第一行" "文本内容第二行" ................................
do
echo "`echo $r | sed这里对文本做筛选`"
done
就是这样对每行做相同的删选,我知道其他的方法也能做,但现在必须要用for做,把文本放在for r in list.txt这地方文本的空格默认就认为一个变量了,无法提取完整的一行
sep 8 23:26:58 mx2 sshd(pam_unix)[23164]: authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=203.86.48.53
Sep 8 23:27:00 mx2 sshd(pam_unix)[23169]: check pass; user unknown
Sep 8 23:27:00 mx2 sshd(pam_unix)[23169]: authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=203.86.48.53
Sep 8 23:27:03 mx2 sshd(pam_unix)[23172]: check pass; user unknown
Sep 8 23:27:03 mx2 sshd(pam_unix)[23172]: authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=203.86.48.53
Sep 8 23:27:05 mx2 sshd(pam_unix)[23175]: check pass; user unknown
Sep 8 23:27:05 mx2 sshd(pam_unix)[23175]: authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=203.86.48.53
这种文本的内容

Re: for循环如何处理文本

发表于 : 2010-09-09 14:13
trigger

代码: 全选

#!/bin/bash
oldIFS=$IFS
IFS=$'\n'
for line in `cat list.txt`
do
echo $line
done
IFS=$oldIFS
sep 8 23:26:58 mx2 sshd(pam_unix)[23164]: authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=203.86.48.53
Sep 8 23:27:00 mx2 sshd(pam_unix)[23169]: check pass; user unknown
Sep 8 23:27:00 mx2 sshd(pam_unix)[23169]: authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=203.86.48.53
Sep 8 23:27:03 mx2 sshd(pam_unix)[23172]: check pass; user unknown
Sep 8 23:27:03 mx2 sshd(pam_unix)[23172]: authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=203.86.48.53
Sep 8 23:27:05 mx2 sshd(pam_unix)[23175]: check pass; user unknown
Sep 8 23:27:05 mx2 sshd(pam_unix)[23175]: authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=203.86.48.53

Re: for循环如何处理文本

发表于 : 2010-09-09 14:29
trigger
从楼主的需求看,不需要循环
sed 's/rhost=203.86.48.53/rip=203.86.48.53/g' list.txt

Re: for循环如何处理文本

发表于 : 2010-09-09 15:07
eexpress
cat xxx|while read i; do xxxxx

IFS改了,麻烦的

如果处理字符,跑正则。何必用bash折腾。/var/log/messages 吧。
#!/usr/bin/perl

@_=grep /authentication failure/, <STDIN>;
@_=map {/[\d\.]*$/;$&} @_;
print @_;

@_里面就是失败的ip的数组了。

Re: for循环如何处理文本

发表于 : 2010-09-09 16:45
trigger
eexpress 写了:cat xxx|while read i; do xxxxx

IFS改了,麻烦的

如果处理字符,跑正则。何必用bash折腾。/var/log/messages 吧。
#!/usr/bin/perl

@_=grep /authentication failure/, <STDIN>;
@_=map {/[\d\.]*$/;$&} @_;
print @_;

@_里面就是失败的ip的数组了。
ee活在自己的世界,人都说了,必须用for :em04

Re: for循环如何处理文本

发表于 : 2010-09-09 17:24
tusooa

代码: 全选

for i in $(seq "$(dog -n file | tail -n1 | sed -re 's/^\s+//' | awk '{print $1}')") ; do
read line
sed something <<< "$line"
done
可以满足lz的需求。很复杂。
其实没有必要用for

Re: for循环如何处理文本

发表于 : 2010-09-09 18:06
eexpress
不会傻到一定要用for的。

额。楼上的,如果要这样搞。咋不直接cut -d= -f 5

Re: for循环如何处理文本

发表于 : 2010-09-10 12:34
aerofox
一定要用 for 循环,那可能是在做作业。为了完全实际任务一般是“不择手段”的。