유닉스 unix awk gawk 와 모든 유틸리티를 사용하여 하는건데요

o_ohamajy의 이미지

last 명령을 치면

ah6113
ah6113
kgu
bluemarin43

이런식으로 아이디와 접속시간이 나오잖아요

총 중복된건 uniq를 사용해서 지우고 하면서

ah6113 2
kgu 1
bluemarin43 이런식으로 중복된건 다 지우고 총 로그인 횟수와
총시간을 합해서 출력하는건데 sed도 상관없고
스크립트로 변수 선언해서 해야하는건데 도전희 모르겠네요 ㅠ

왠만하면 혼자 해보려고 주말내내 해봤는데 도저희 모르겠네여 ㅠ

스크립트 작성도 c언어랑은 달라서 모르겠고 ㅠ 제발 도와주세요

여러분! ㅠㅠ

o_ohamajy의 이미지

{count[$1++]
if(count[$1]==$1)
for(i=0; i num++
}

스크립트 이런식으로 작성 해서 같은 아이디 저장하고 로그인 횟수 증가시키는거같은데 ㅠ

gawk -f scrip zz (zz는 last >> zz 저장시켜논거입니다 ㅠ)

도와주세여 ㅜㅜ

ymir의 이미지

$ cat last.sh
#!/bin/bash
 
LAST_OPTS="-R"
[ -n "$1" -a -f "$1" ] && LAST_OPTS+=" -f $1"
 
declare -a users ltimes lcounts
 
sec_to_dhms()
{
	let local d=${1}/86400
	let local h=(${1}%86400)/3600
	let local m=(${1}%3600)/60
	let local s=${1}%60
 
	printf "%d days and %02d:%02d:%02d" $d $h $m $s
}
 
print_users_logtime()
{
	local i=0
	while [ $i -lt ${#users[@]} ]
	do
		echo "${users[$i]}	: ${lcounts[$i]-0} logins for $(sec_to_dhms ${ltimes[$i]-0}) (${ltimes[$i]-0} seconds)"
		let i++
	done
}
 
put_user_ltime()
{
	local i=0
	while [ $i -lt ${#users[@]} ]
	do
		[ "${users[$i]}" = "$1" ] && break
		let i++
	done
	[ $i -eq ${#users[@]} ] && users+=("$1")
 
	[[ $2 == *+* ]] && day=$(expr ${2/+*} \* 86400) || day=0
	hm=${2/*+}
	secs=$(expr $day + ${hm/:*} \* 3600 + ${hm/*:})
 
	let ltimes[$i]=${ltimes[$i]-0}+$secs
	let lcounts[$i]++
}
 
last $LAST_OPTS | sort | grep -v ^reboot > .last.tmp
while read -r line
do
	user=$(echo $line | awk '{print $1}')
	ltime=$(echo $line | sed -n 's/.*(\(.*\)).*/\1/p')
	[ -z "$ltime" ] && continue
	put_user_ltime $user $ltime
done < .last.tmp
/bin/rm -f .last.tmp
 
print_users_logtime
 
exit 0;
 
$ ./last.sh
******  : 12 logins for 1 days and 08:04:01 (115441 seconds)
****    : 6 logins for 0 days and 12:01:24 (43284 seconds)
****    : 12 logins for 0 days and 00:00:07 (7 seconds)
******* : 18 logins for 8 days and 21:11:47 (767507 seconds)
$ ./last.sh /var/log/wtmp.1
******  : 43 logins for 4 days and 17:16:00 (407760 seconds)
******* : 1 logins for 0 days and 01:00:36 (3636 seconds)
****    : 61 logins for 7 days and 13:18:39 (652719 seconds)
****    : 22 logins for 17 days and 22:06:26 (1548386 seconds)
******* : 28 logins for 19 days and 14:11:43 (1692703 seconds)

검증은 안 해봤음. 대충 아이디어만 보세욤.
현재 로그인 되어 있는 계정에 대해서는 무시함 (계산에 포함 안 됨).

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

o_ohamajy의 이미지

그런데 전 배우는 학생이다 보니. 그대로 써도. 접근 제한이 나와서 못쓰네여 ㅠ 로그인 시간과. 초,분,시간, 나오게
파이프사용하여 명령이나. gawk -f 스크립트를 사용하여서는 할수없을까여 ㅜㅜ? last >> datafile 이런식으로 cat으로 저장해서 해도 되는데 ㅠ
아니면. 그냥 last | 명령후에 바로 파이프로 해도 되구여 ㅜ

ymir의 이미지

접근 제한..????
뭐에 대한 접근 제한이란 말인지 모르겠군요.

/var/log/wtmp 는 일반적으로 other 에게도 read 를 허용합니다.
last 명령으로 결과를 볼 수 있다면, 스크립트 실행에 문제는 없습니다.

만약 스크립트를 실행했는데 permission denied 가 떴다면, 스크립트에 실행 권한이 없어서일테니..
chmod 명령으로 스크립트에 실행 권한을 주세요.

$ ./last.sh
$ bash: ./last.sh: Permission denied
$ chmod u+x last.sh

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

익명 사용자의 이미지

총 시간은 분 단위로만 표시하도록 했으니까 참고하세요.

#!/bin/bash
 
last | awk '
{ if (NF > 9 && $10 != "in" ) {
    if (x=index($10,"+") > 0) {
      days = substr($10,2,x);
    } else {
      days = 0;
      x = 2;
    }
    split(substr($10,x,length($10)-2),timearray,":");
    time = 0;
    for (i in timearray) {
      time = time * 60 + timearray[i];
    }
    time += days * 24 * 60;
    if (userlogtimes[$1] == "") {
      userlogtimes[$1] = time;
    } else {
      userlogtimes[$1] += time;
    }
    userlogins[$1]++;
  }
}
 
END {
  for (i in userlogins) {
    print i, userlogins[i], userlogtimes[i];
  }
}'
o_ohamajy의 이미지

정말 유닉스 막막한데 도와주셔서 감사합니다 ㅜㅜ 음 ㅠ 근데 마지막에 나오는건 분? 인가요 ㅠ? 아직 초보다 보니 해석이 잘 안되네요 ㅠ

익명 사용자의 이미지

C언어와 달라서 헷갈린다고 하셨는데 차이점을 좀 얘기해 드릴게요.
awk에서는 숫자, 문자열 차이를 엄격하게 구분하지 않습니다.
그래서인지 array 안에 들어가는 index의 경우도, 정수 뿐만 아니라 문자까지 허용합니다.
즉, array가 (이름과는 달리) hashtable 로 구현된다고 보시는 게 좋습니다.

그렇기 때문에 아래와 같은 것도 가능합니다.

username = $1;
userlogins[username]++;
# 로그인 횟수 기록을 하나 증가

userlogins의 색인으로 username을 정하고,
같은 username이 나타날 때마다 1씩 증가시켜 줍니다.

제가 우분투에서 last를 돌려보니 10번째 행에서 (d+hh:mm) 같은 형식이 나오더군요.
substring으로 $10을 쪼개서 괄호문자를 없애고, days 를 추출.
다시 split으로 시,분을 추출.
그런 다음 time으로 합산했습니다.
이제 userlogtimes 안에 있는 값과 합산해서 저장합니다.

userlogtimes[$1] += time;

마지막으로, END부분에서 for (i in userlogins) 를 돌리면,
아까 색인을 username으로 정했으므로 i값이 곧 아이디가 됩니다.

for (user in userlogins) {
  print user, userlogins[user], userlogtimes[user];
  #     아이디, 로그인횟수, 로그인시간(분단위)
}

즐 코딩하세요.
o_ohamajy의 이미지

아. 배열에 문자열이 들어가길래 당황도 하고 그랬네여 ㅎㅎ 혹시 ㅠ
사용자 별로 작업시간이 제일 작았던 경우와 제일 길었던 경우와. 사용자의 요일별로 작업시간을 계산하여
출력 하려고 하는데 어떻게 해야하나요 ㅠ 필드 구분자로도 해보려고 하는데 ㅠ 안되네요 ㅠ
스페이스바 칸위치도 다르고 ㅠ ( 필드 지정도 안되고 ㅠ 스크립트로 하려고 하는데도 정말 힘드네요 ㅠㅠ

익명 사용자의 이미지

힌트만 드릴게요. 제가 숙제를 대신해드릴 수는 없는지라;;;
awk의 기본 개념을 처음부터 들여다보시면 별로 어렵지 않을 거에요.

http://www.grymoire.com/Unix/Awk.html#uh-23

sepchar = ",";
userLogtimeByWeekday[username sepchar weekday] += time;

나머지 숙제는 알아서 ^^

PS. 영문으로는 공부할 만한 자료가 풍부하고 무궁무진합니다.
구글에서 awk tutorial 검색해 보세요.
저도 위 문서를 처음부터 끝까지 읽고 30줄 코딩한 겁니다.

o_ohamajy의 이미지

영어 실력도 안될뿐만 아니라... 교수님께서도 그렇게

자세한건 안배웠거든요 ㅠ 그냥 split? 이건 분할 할떄 쓴다.

이정도만 배운지라.

{count[$1]++
time=0;
if(count[$1]==1){
name[i++]=$1;
time=time+$2
}
}
END{for(j=0; j

이렇게 까지는 했거든요.. 사용자 아이디와 로그인 횟수는
대충 만들어서 저장을 하였는데.. 필드 구분자 -F로 쪼개야 되는데 괄호(도 들어가구 스페이스 : 도 들어가더라구요 ㅠ

어떻게 해야할지 모르겠어요 ㅠ

o_ohamajy의 이미지

유닉스 책과 리눅스 책을 찾아서 검색해봤는데

리눅스에선 러닝 리눅스에서만 몇줄 나오는데

내용이 다르ㅜ ㅠ 뭔지도모르겠구요 ㅠ솔루션도 따로 없어서 ㅠ

정말 막막하네요 ㅠㅠ 도와주세요 ㅠㅠ 원래 머리가 안되서.

c 코드 같은것도 외워버리는 타입이라 ㅠ 거의 이문제만
70시간째 보고 있는거같네요.. -F'[: \(\)] 이런것도 해보는데

다안되네요 ㅠ

익명 사용자의 이미지

구글링을 통한 튜토리얼들 베껴서라도 해 보세요.
자꾸 해 봐야 실력이 늡니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.