- 세상의 모든 계산기 자유(질문) 게시판 일반 ()
(Nginx) "웹 크롤러 request 순위 확인" 스크립트 (우분투)
#!/bin/bash
# monip.sh
# Nginx access 로그에서 상위 25개 IP를 분석하여
# - Bot (Crawler)인 경우: User-Agent 문자열로 Bot 종류를 추출
# - User인 경우: whois 명령으로 Organization Name 조회
# 그리고 IP별 국가 정보(geoiplookup)를 추가하여 출력함
LOG_FILE="/var/log/nginx/access.log"
if [ ! -f "$LOG_FILE" ]; then
echo "로그 파일이 존재하지 않습니다: $LOG_FILE"
exit 1
fi
awk '
# Bot의 종류를 판별하는 함수
function get_bot_type(ua, ua_lower) {
ua_lower = tolower(ua)
if(ua_lower ~ /googlebot/) return "Googlebot"
if(ua_lower ~ /bingbot/) return "Bingbot"
if(ua_lower ~ /slurp/) return "Yahoo Slurp"
if(ua_lower ~ /duckduckbot/) return "DuckDuckBot"
if(ua_lower ~ /baiduspider/) return "Baiduspider"
if(ua_lower ~ /yandex/) return "YandexBot"
return "Unknown Bot"
}
# User-Agent 문자열을 바탕으로 사용자 종류를 판별
function classify_user_agent(ua) {
if(ua == "" || ua == "-") return "알 수 없음"
ua_lower = tolower(ua)
if(ua_lower ~ /bot|crawl|spider|slurp|mediapartners/) return "Bot (Crawler)"
return "User"
}
# geoiplookup 명령을 사용하여 IP의 국가 정보를 가져오는 함수
function get_country(ip, cmd, result, arr, country) {
cmd = "geoiplookup " ip " 2>/dev/null"
if ((cmd | getline result) > 0) {
# 예: "GeoIP Country Edition: US, United States"
split(result, arr, ":")
if(length(arr) > 1) {
country = arr[2]
gsub(/^[ \t]+|[ \t]+$/, "", country)
} else {
country = "Unknown"
}
} else {
country = "조회 실패"
}
close(cmd)
return country
}
{
# Combined log format 예제:
# 127.0.0.1 - - [14/Feb/2025:12:00:00 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 ..."
regex = "([^ ]*) - ([^ ]*) \\[([^\\]]*)\\] \"([^\"]*)\" ([^ ]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\""
if(match($0, regex, arr)) {
ip = arr[1]
referer = arr[7]
ua_str = arr[8]
count[ip]++ # IP별 요청 횟수 집계
ua_stats[ip, ua_str]++ # IP별 User-Agent 빈도 집계
ref_stats[ip, referer]++ # (참고용) 리퍼러 집계
}
}
END {
# gawk의 asorti() 함수로 요청 횟수 기준 내림차순 정렬
n = asorti(count, sorted, "@val_num_desc")
# 헤더 출력 (순서: 순위 | IP | 국가 | Requests | 사용자 종류 | 기타정보)
printf("| %-2s | %-15s | %-18s | %-10s | %-17s | %-21s |\n", "순위", "IP", "국가", "Requests", "사용자 종류", "기타정보")
print("|------|-----------------|----------------------|------------|------------------------|-------------------------|")
limit = (n < 25 ? n : 25)
for(i = 1; i <= limit; i++){
ip = sorted[i]
req_count = count[ip]
# 해당 IP의 가장 많이 등장한 User-Agent 선택
max_ua = ""
max_ua_count = 0
for(key in ua_stats) {
split(key, parts, SUBSEP)
if(parts[1] == ip) {
if(ua_stats[key] > max_ua_count) {
max_ua_count = ua_stats[key]
max_ua = parts[2]
}
}
}
user_type = classify_user_agent(max_ua)
extra = ""
if(user_type == "User") {
# User인 경우: whois 명령으로 Organization Name 조회
cmd = "whois " ip " 2>/dev/null | grep -i -m 1 \"orgname:\""
org = ""
if((cmd | getline org) > 0) {
sub(/^[ \t]+/, "", org)
split(org, a, ":")
if(length(a) > 1) {
org = a[2]
gsub(/^[ \t]+/, "", org)
}
} else {
org = "조회 실패"
}
close(cmd)
extra = org
} else if(user_type == "Bot (Crawler)") {
extra = get_bot_type(max_ua)
} else {
extra = "없음"
}
# 각 IP의 국가 정보 추가
country = get_country(ip)
printf("| %-4d | %-15s | %-20s | %-10d | %-22s | %-25s |\n", i, ip, country, req_count, user_type, extra)
}
}
' "$LOG_FILE"
사용 방법
- 스크립트를 파일에 저장 후 실행 권한 부여:
chmod +x monip.sh - 스크립트 실행 (필요한 경우 sudo로):
sudo ./monip.sh
결과

세상의모든계산기 님의 최근 댓글
참고 - [공학용 계산기] 정적분 계산 속도 벤치마크 비교 https://allcalc.org/9677 2025 12.11 다른 계산기의 경우와 비교 1. TI-nspire CAS ㄴ CAS 계산기는 가능한 경우 부정적분을 먼저하고, 그 값에 구간을 대입해 최종값을 얻습니다. ㄴ 부정적분이 불가능할 때는 수치해석적 방법을 시도합니다. 2. CASIO fx-991 ES Plus ㄴ CASIO 계산기의 경우, 적분할 함수에 따라 시간이 달라지는 것으로 알고 있는데, 정밀도를 확보할 별도의 알고리즘을 채택하고 있는 것이 아닐까 생각되네요. 2025 12.11 일반 계산기는 보통 리셋기능이 따로 없기 때문에, 다른 요인에 영향을 받을 가능성은 없어 보이구요. '원래는 잘 되었는데, 지금은 설정 값이 날아간다'면 메모리 값을 유지할만큼 배터리가 꾸준하게 공급되지 않기 때문일 가능성이 높다고 봐야겠습니다. - 태양광이 있을 때는 계산은 가능하지만, 서랍등에 넣으면 배터리가 없어서 리셋 https://blog.naver.com/potatoyamyam/223053309120 (교체 사진 참조) 1. 배터리 준비: * 다이소 등에서 LR54 (LR1130) 배터리를 구매합니다. (보통 4개 들이 1,000원에 판매됩니다. LR44와 높이가 다르니 혼동하시면 안됩니다.) 2. 준비물: * 작은 십자드라이버 (계산기 뒷면 나사용. 이것도 없으시면 다이소에서...) 3. 커버 분해: * 계산기 뒷면의 나사를 풀고, 머리 부분(윗부분)의 커버를 조심스럽게 분해합니다. (참고해주신 블로그 사진을 보시면 이해가 빠르실 겁니다.) 4. 배터리 교체: * 기존 배터리를 빼냅니다. * 새 LR54 배터리의 '+'극 방향을 정확히 확인하여 제자리에 넣어줍니다. (대부분의 경우 '+'극이 위로 보이도록 넣습니다.) 5. 조립: * 커버를 다시 닫고 나사를 조여줍니다. * 블로그 사진을 보니 배터리 연결선 등이 눌려서 씹혀 있네요. 원래 씹히도록 설계를 안하는데, 원래 그렇게 만들어 놓은 건지? 모르겠네요. 여튼 씹히면 단선될 가능성이 있으니, 잘 보시고 플라스틱 틈새 등으로 적절히 배치해서 안씹히게 하는 것이 좋습니다. 6. TAX 재설정: * 계산기의 전원을 켜고 TAX 요율을 10%로 다시 설정합니다. 2025 12.10 TI-nspire 입력 방법 solve({x+a+b=5,x)|a=1 and b=2 2025 12.01 질문하실 때는 항상 계산기 모델명을 정확하게 적으셔야 합니다. 2025 12.01